unittestの書き方
pythonのunittestのやり方をよく忘れるのでメモ&まとめ。
テストケースを作る
import HogeModule # テスト対象のモジュール import unittest class testHogeModule(unittest.TestCase): # HogeModuleテストケース def test_foo(self): # foo関数のテストメソッド self.assertEquals(HogeModule.foo(1, 2), 3) def test_bar(self): # bar関数のテストメソッド ・・・・
テストメソッドは、prefixにtestを付ける。そうするとフレームワーク側で勝手に呼び出してくれる。テストの際、初期化や終了処理などが必要な場合、それぞれsetUpメソッドとtearDownメソッドで行う。
テストスイートを作る
テストケースを書いたら、テストケースをテストスイートにまとめる。
def suite(): suite = unittest.TestSuite() suite.addTest(unittest.makeSuite(testHogeModule)) suite.addTest(・・・) ・・・ return suite
上のように、suiteって名前の関数にまとめとくと
if __name__ == '__main__': unittest.main()
こんな感じで簡単にテストを実行できる。上のコードは、
if __name__ == '__main__': unittest.TextTestRunner(verbosity=1).run(suite())
と同じ意味。verbosityは
- verbosity=0の場合、テストの途中経過何も表示しない。
- verbosity=1の場合、一個のテストにつきドット(.)が一個出力される。(デフォルト)
- verbosity=2の場合、テスト中の関数名が表示される
テストスイートを書かずに、ちょろっと、例えばtest_fooだけテストしたい場合、こんな感じで。
if __name__ == '__main__': suiteFew = unittest.TestSuite() suiteFew.addTest(testHogeModule("test_foo")) unittest.TextTestRunner(verbosity=2).run(suiteFew)
unittest.TextTestRunnerの出力サンプル
こんな感じのテストコードを
import unittest class testSample(unittest.TestCase): def test_good(self): self.assertEquals((1 + 1), 2) def test_bad(self): self.assertEquals((1 + 2), 4)
verbosity=2でテストしてみる。出力結果は下のような感じ。
test_bad (__main__.testSample) ... FAIL test_good (__main__.testSample) ... ok ====================================================================== FAIL: test_bad (__main__.testSample) ---------------------------------------------------------------------- Traceback (most recent call last): File "<stdin>", line 6, in test_bad AssertionError: 3 != 4 ---------------------------------------------------------------------- Ran 2 tests in 0.000s FAILED (failures=1)
参考:
5.3 unittest -- 単体テストフレームワーク
http://www.python.jp/doc/release/lib/module-unittest.html