PythonのJUnit系のテストライブラリ unittest についてご紹介します。
使い方
まずは最もベーシックな使い方から。
最小の流れは次のようなものになります。 unittest ライブラリの読み込み unittest.TestCase を継承したクラスの中にテストケースを書く unittest.main() でテストを実行する
ことばで聞くよりコードを見るのが早いので、例を見てみます。
# unittest ライブラリを読み込んでおく
import unittest
# テスト対象の関数
def factorial(n):
"""factorial function"""
if n < 2:
return 1
return factorial(n - 1)
# テストケースをまとめたクラス
# メソッド名が test で始まるメソッドがひとつのテストとなる
class FactorialTest(unittest.TestCase):
def test_factorial_with_arg_1(self):
expected = 1
actual = factorial(1)
self.assertEqual(expected, actual)
# 直接実行されたときのみ unittest.main() を呼び出して
# テストケースを回す
if __name__ == "__main__":
unittest.main()
ここで、 factorial の部分はテストではなくテスト対象となるコードです。簡単化のために、テスト対象コードとテストケースとが同一モジュールに入っている状態にしています。
unittest.main() が呼び出されると、そのスクリプトの中で unittest.TestCase を継承したすべてのクラスがテストケースのかたまりとして認識され、そのメソッドのうち名前の先頭が test で始まるメソッドだけがテストケースとして実行されます。
各テストケースの中にはひとつ以上のアサート用メソッドを書きます。 unittest のアサート用のメソッドは「self.assert***」という形で呼び出します。***の部分には Equal True False などさまざまなアサーションチェックが行える単語が入ります。
具体的なアサート用のメソッドとしては、次のようなものが用意されています。
- assertEqual(a, b)
- assertNotEqual(a, b)
- assertTrue(x)
- assertFalse(x)
- assertIs(a, b)
- assertIsNot(a, b)
- assertIsNone(x)
- assertIsNotNone(x)
- assertIn(a, b)
- assertNotIn(a, b)
- assertIsInstance(a, b)
- assertNotIsInstance(a, b)
このスクリプトを python スクリプト名 で実行すると、テストが実行され、OKやエラーなどの結果が表示されます。
unittest の最小単位はこれだけです。
各テストケースの前後でお決まりの処理を行いたい場合は setUp tearDown メソッドを使います。
class FactorialTest(unittest.TestCase):
# 各ケースの最初に実行してほしい処理
def setUp(self):
self.f = open(targetfile, 'r')
# 各ケースの終わりに実行してほしい処理
def tearDown(self):
self.f.close()
setUp には最初の処理を、tearDown には最後の処理を書いておきます。 python スクリプト名 とするだけでは、アサーションに失敗しないかぎり、具体的にどのテストケースが実行されているのかの詳細は表示されません。テストの詳細を表示してほしい場合はpythonコマンドに -v オプションを渡します。
$ python スクリプト名 -v
スクリプトの中にあるテストケースすべてではなく、特定のテストケース(クラス)だけを指定して実行したい場合は -m オプションで unitest を読み込んだあとにクラス名で指定します。
$ python -m unittest スクリプト名.テストケース名
たとえば、上記の FactorialTest が factorial.py というファイルに入っている場合であれば次のように実行します。
$ python -m unittest factorial.FactorialTest
テストスクリプトを個別に指定せずに、まとめて実行してほしい場合には unittest の discover サブコマンドを使います。
$ python -m unittest discover
discover について詳しくは公式ドキュメントの discover の項をご覧ください。
インストール
unittest はデフォルトでPythonの実行環境に含まれているため、別途インストールは不要です。
import unittest とすることですぐに使い始めることができます。
以上です。