LoginSignup
2
2

More than 5 years have passed since last update.

unittest の雰囲気チートシート

Posted at

概要

  • 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 は使ってないです。
2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2