Python のお勉強11 ( ユニットテスト )
「Python のお勉強シリーズ」第11回目は、ユニットテストをやってみました。
Python では unittest というテストケースを作成する TestCase クラスとテストケースを実行するテストランナーを用意しているモジュールが標準で含まれているみたいです。今回はこいつを使ってます。
・26.3. unittest — ユニットテストフレームワーク — Python 3.4.3 ドキュメント
http://docs.python.jp/3.4/library/unittest.html
■ testtarget.py ( テスト対象のモジュール )
# -*- coding: cp932 -*- def add(a, b): return a + b def sub(a, b): return a - b def hello(name): return "Hello " + name def genlist(a, b, c): return [a, b, c]
■ testsample.py ( testtarget のテストケース )
#coding: cp932 import testtarget as tt import unittest #unittest.TestCase を継承したクラスを定義する class TestSample(unittest.TestCase): #テストケースのメソッド名は "test_" で始める def test_add(self): r = tt.add(10, 20) self.assertEqual(r, 30) def test_sub(self): r = tt.sub(20, 10) self.assertEqual(r, 10) def test_hello(self): r = tt.hello("hoge") self.assertEqual(r, "Hello hoge") def test_genlist(self): r = tt.genlist("a", "B", 3) self.assertEqual(r, ["a", "B", 3]) #意図的にテストケースをスキップする @unittest.skip("skip test") def test_hoge(self): pass #意図的にテストケースを失敗させる @unittest.expectedFailure def test_add2(self): r = tt.add(10, 20) assertEqual(r, 30) #以下を書いておくと python testsample.py でもテストが実行される if __name__ == "__main__": unittest.main()
■ 実行結果
.x..s. ---------------------------------------------------------------------- Ran 6 tests in 0.001s OK (skipped=1, expected failures=1)
※ テストケースの実行は「python -m unittest testsample」でできます。unittest.main() 書いてるなら「python testsample.py」でも。
unittest.TestCase 継承したクラスを作成して、テストケースは "test_" で始まるメソッドで書く、という感じです。関数デコレータ skip で意図的なテストケースのスキップ、expectedFailure で意図的なテストケースの失敗とかできるみたいです。
今回は assertEqual ( a == b ) しか使ってませんが、assert の一覧は以下にあります。
・26.3. unittest — ユニットテストフレームワーク — Python 3.4.3 ドキュメント
http://docs.python.jp/3.4/library/unittest.html?highlight=testcase#assert-methods
以上になります。