PythonでUnitTestとCodeCoverageをやってみる(1)

| | Comments (0) | TrackBacks (0)
RedHat系の提供するpythonには、デフォルトでunittest.pyというUnitTestを行うためのツールが付属していますので、これを利用してまずUnitTestを行ってみたいと思います。
まず、以下のようなサンプルプログラムを用意します。 このプログラムは、簡単な数値計算をするプログラムです。
class Calc:
        def __init__(self):
                self.intCount = 0
        def tasu (self, number = 1):
                self.intCount = self.intCount + number
        def hiku (self, number = 1):
                self.intCount = self.intCount - number
        def kakeru (self, number = 1):
                self.intCount = self.intCount * number
        def waru (self, number = 1):
                self.intCount = self.intCount / number
        def dummy (self):
                self.intCount = self.intCount
        def population (self):
                return self.intCount

Calc.pyというファイル名で保存してください。
次にこのプログラムに対するテストコードを作成します。
テストコード作成の手順
  1. * テストは、引数をとらないパブリックメソッドとして test* という名前で記述します
  2. * テストメソッドの中で アサーションメソッドを使用して、期待される値と実際の値が等しいことを確かめます。
testXXXXXメソッド
「test」で始まるメソッドを各テストケースとして実行します。このメソッドが実行される前にsetUpメソッド、実行後にtearDownメソッドが実行されます。
setUpメソッド
各テストメソッドが実行される前に、setUp()という名前のテンプレートメソッドが実行されます。 setUp()は、テスト対象のオブジェクトを生成したり、拡張モジュールをチェックするような場合に使用します。
tearDownメソッド
テストメソッドの実行が終了すると、それが成功したか否かにかかわらず、tearDown()という名前のテンプレートメソッドが実行されます。 tearDown()では、テスト対象のオブジェクトの後始末などを行います。
#!/usr/bin/env python
import sys
import unittest
from Calc import *

class testCalc(unittest.TestCase):

        def setUp(self):
                self.myCalc = Calc()
        def tearDown(self):
                self.myCalc = None

        def test0Tasu5(self):
                self.myCalc.tasu(5)
                assert self.myCalc.population() == 5,  'error testTasu5'
        def test0Hiku5(self):
                self.myCalc.hiku(5)
                assert self.myCalc.population() == -5, 'error testHiku5'
        def test10Kakeru2(self):
                self.myCalc.intCount = 10
                self.myCalc.kakeru(2)
                assert self.myCalc.population() == 20,  'error testKakeru2'
        def test10Waru2(self):
                self.myCalc.intCount = 10
                self.myCalc.waru(2)
                assert self.myCalc.population() == 5, 'error testWaru2'

class testSuiteCalc(unittest.TestSuite):
     def __init__(self):
         tests = ['test0Tasu5', 'test0Hiku5', 'test10Kakeru2', 'test10Waru2']
         unittest.TestSuite.__init__(self,map(testCalc, tests))

if __name__ == '__main__':
    suite1 = unittest.TestLoader().loadTestsFromTestCase(testCalc)
    suite2 = unittest.makeSuite(testCalc)
    suite3 = testSuiteCalc()
#    alltests = unittest.TestSuite([suite1, suite2, suite3])
    alltests = unittest.TestSuite([suite3])
    unittest.TextTestRunner(verbosity=2).run(alltests)

これをtestSuiteCalc.py というファイル名で保存します。
テストケースは、上記テストコードのようにテスト・スーツにグループ化することができます。

テストコードを作成したら、コードを実行してUnitTestを実行します。
$ python testSuiteCalc.py
test0Tasu5 (__main__.testCalc) ... ok
test0Hiku5 (__main__.testCalc) ... ok
test10Kakeru2 (__main__.testCalc) ... ok
test10Waru2 (__main__.testCalc) ... ok

----------------------------------------------------------------------
Ran 4 tests in 0.002s

OK


次回は、trace2htmlを使ってコードカバレッジのレポートをHTML出力してみたいと思います。

0 TrackBacks

Listed below are links to blogs that reference this entry: PythonでUnitTestとCodeCoverageをやってみる(1) .

TrackBack URL for this entry: http://lab.hde.co.jp/blog/mt-tb.cgi/44

Leave a comment

About this Entry

This page contains a single entry by Taizo ITO published on July 1, 2008 5:21 PM.

日経225のSPF対応状況(2008年6月) was the previous entry in this blog.

Ruby on RailsのプロジェクトをApache2で簡単に動かすソフトウェア is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.