Λάδι Βιώσας

http://profile.hatena.ne.jp/kenkitii/

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