2014/03/12

ライブラリ:unittest

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 とすることですぐに使い始めることができます。


以上です。


参考
unittest — Unit testing framework — Python公式ドキュメント
Test-Driven Development in Python - O'Reilly Media
Testing Your Code — The Hitchhiker's Guide to Python

0 件のコメント: