unittestモジュールには、テストの開発や実行の為の優れたツールが 用意されており、この節では、その一部を紹介します。ほとんどのユーザとって は、ここで紹介するツールだけで十分でしょう。
以下は、randomモジュールの三つの関数をテストするスクリプトです。
import random import unittest class TestSequenceFunctions(unittest.TestCase): def setUp(self): self.seq = range(10) def testshuffle(self): # make sure the shuffled sequence does not lose any elements random.shuffle(self.seq) self.seq.sort() self.assertEqual(self.seq, range(10)) def testchoice(self): element = random.choice(self.seq) self.assert_(element in self.seq) def testsample(self): self.assertRaises(ValueError, random.sample, self.seq, 20) for element in random.sample(self.seq, 5): self.assert_(element in self.seq) if __name__ == '__main__': unittest.main()
テストケースは、unittest.TestCaseのサブクラスとして作成します。メ ソッド名が"test"で始まる三つのメソッドがテストです。テストランナー はこの命名規約によってテストを行うメソッドを検索します。
これらのテスト内では、予定の結果が得られていることを確かめるために assertEqual()を、条件のチェックにassert_()を、例外が発 生する事を確認するためにassertRaises()をそれぞれ呼び出していま す。assert文の代わりにこれらのメソッドを使用すると、テストラン ナーでテスト結果を集計してレポートを作成する事ができます。
setUp()メソッドが定義されている場合、テストランナーは各テストを 実行する前にsetUp()メソッドを呼び出します。同様に、 tearDown()メソッドが定義されている場合は各テストの実行後に呼び 出します。上のサンプルでは、それぞれのテスト用に新しいシーケンスを作成するため にsetUp()を使用しています。
サンプルの末尾が、簡単なテストの実行方法です。unittest.main()は、 テストスクリプトのコマンドライン用インターフェースです。コマンドラインか ら起動された場合、上記のスクリプトから以下のような結果が出力されます:
... ---------------------------------------------------------------------- Ran 3 tests in 0.000s OK
簡略化した結果を出力したり、コマンドライン以外からも起動する等のより細かい 制御が必要であれば、unittest.main()を使用せずに別の方法でテストを 実行します。例えば、上記サンプルの最後の2行は以下のように書くことができ ます:
suite = unittest.TestLoader().loadTestsFromTestCase(TestSequenceFunctions) unittest.TextTestRunner(verbosity=2).run(suite)
変更後のスクリプトをインタープリタや別のスクリプトから実行すると、以下の 出力が得られます:
testchoice (__main__.TestSequenceFunctions) ... ok testsample (__main__.TestSequenceFunctions) ... ok testshuffle (__main__.TestSequenceFunctions) ... ok ---------------------------------------------------------------------- Ran 3 tests in 0.110s OK
以上がunittestモジュールでよく使われる機能で、ほとんどのテスト ではこれだけでも十分です。基礎となる概念や全ての機能については以降の章を 参照してください。
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。