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


以上になります。

[ 環境情報 ]
Windows 7 SP1
Python 3.4.3