概要
- unittest の雰囲気チートシート
- 雰囲気チートシートとはだいたいの考え方だけを思い出させるためのもの(今考えた)
- 詳細とか関数一覧とかはドキュメントとかほかの人の記事を見れば載っているのでそちらに譲る
雰囲気
凄くありがちなこの関数をテストしたいとします。
sample.py
def my_add(a, b):
return a + b
二つの引数の和を返す関数です。
そしてこれをテストするモジュールを作ります。
本当は test
ディレクトリを別に作った方が親切なのですが、パスを通すのが面倒なので同階層に作ります。
お決まりの構成のあの unittest を書きます。
test_sample.py
import sample
import unittest
class TestMyAdd(unittest.TestCase):
def test_check_correct_result(self):
result = sample.my_add(1, 2)
self.assertEqual(result, 3)
if __name__ == '__main__':
unittest.main()
関数ひとつに対してテストクラスを一つ作り、必要なテストメソッドを実装します。
setUp()
という名前のメソッドを定義すればこのクラスが呼び出されたときに最初に呼び出されるので、前準備がいる場合はここに書きます。
tearDown()
という名前のメソッドをメソッドを定義すれば最後にこのメソッドが呼び出されるので、後片付けしたい場合はここに書きます。
実行したらどうなるでしょうか。こうなりますよね。
$ python test_sample.py
.
----------------------------------------------------------------------
Ran 1 test in 0.000s
OK
ここで実装を間違えていて
sample.py
def my_add(a, b):
return a - b
なんて書いてしまっていた日には下のように教えてくれるわけです。
$ python test_sample.py
F
======================================================================
FAIL: test_check_correct_result (__main__.TestMyAdd)
----------------------------------------------------------------------
Traceback (most recent call last):
File "test_sample.py", line 8, in test_check_correct_result
self.assertEqual(result, 3)
AssertionError: -1 != 3
----------------------------------------------------------------------
Ran 1 test in 0.001s
FAILED (failures=1)
ちなみに .
が OK を表し、想定した結果になっていない AssertionError
の場合は F
が表示されます。
「合ってる / 合ってない」以前に想定しないエラーが発生した場合は E
が出てきます。
わかりやすいですね。
いい感じに結果を出力しれくれるのは unittest.main()
の働きです。
テストメソッドを単体で呼び出してもこういう親切な表示はされません。
また、だいたいテストはまとめて実行されるので if __name__ == '__main__':
節の中に入れておくのがよいですよね。
まとめ
- 今は現場で pytest を使っているので unittest は使ってないです。