Python unittestを試してみる

Python学習【365日チャレンジ!】174日目のマスターU(@Udemy11)です。

今日は釣具屋で結構な時間を過ごしてしまいました。

長い時間を過ごしたにも関わらず、購入したものは、小物ケースとスナップのみ。

「今持っているタックルをもっと便利に使えるものがないかな〜」

と思いながらうろついていると、知らない間に時間が経ってしまいます。

それでは今日もPython学習をはじめましょう。

昨日の復習

昨日は、unittestについて学習しました。

unittestは、doctestと違ってテスト用のファイルを作成して、テストしました。

assertを使っていろいろな種類のテストができましたね。

unittestの基本については、昨日の記事をごらんください。

今日は、unittestで例外処理を扱ってみます。

calculation.py

昨日同様にテストするファイルはcalculation.pyで、コードも同じです。

class Cal(object):
    def add_and_double(self, x, y):
        if type(x) is not int or type(y) is not int:
            raise ValueError
        result = x + y
        result *= 2
        return result

値を足してから2乗する関数add_and_doubleの引数xyが整数でなかったときにはValueErrorが返されます。

昨日同様、このモジュールについてtest_calculation.pyでテストします。

test_calculation.py

今回は例外処理が正確に例外(ValueError)を返すかどうかを確認するので、ValueErrorが返される場合に正しく処理できたという結果を返すコードを書いてみます。

import unittest

import calculation

class CalTest(unittest.TestCase):
    def test_add_and_double_raise(self):
        cal = calculation.Cal()
        with self.assertRaises(ValueError):
            cal.add_and_double('1', '1')

if __name__ == '__main__':
    unittest.main()

7行目までは、6行目の関数の名前に_raiseが付いているだけで昨日のコードと同じです。

8行目、9行目では、withステートメントでassertRaises()を使い、関数cal.add_and_double('1', '1')を実行したときにValueErrorが起こることを想定しています。

実行結果

test_calculation.pyを実行すると、結果は次のようになります。

Ran 1 test in 0.005s

OK

1つのテストを実行して問題がなかったという表示になります。

テストの対象となるモジュールであるcalculation.pyの関数add_and_double()に引数xyに文字列の1を入れた場合は、ValueErrorが起こります。

エラーが起こるのが正常なので、正常にエラーが起こってテストが成功したということです。

エラーが正常?

今回は、例外(ValueError)が起こることを想定したテストでした。

エラーなのに、正常というのがちょっとややこしいですが、想定していることが起こるかどうかを確認するのがテストなので、このようなテストもあることを理解しておきましょう。

プログラミングは、たまに頭がこんがらがりそうになることが多いので慣れが必要ですね。

学習すればするほど難しくなってくるのは、英語学習と同じようなものですが、数をこなすしかないのも英語学習と一緒です。

しっかりと数をこなしてPythonのスキルをアップしましょう!

それでは、明日もGood Python!