2011年7月2日土曜日

Pythonで動的にサブクラスを生成

excelとかDBとかにテストケース用のデータを追加したら
勝手にテストクラスにテストケース(つまりテストメソッド)が追加される、
とかそういうことをやりたい。

で、unittest.TestCaseクラスのサブクラスを
テストデータから動的に生成して実行したいと思ったときに、
どうやれば良いのかちょっと悩んだので、メモ。

動的にサブクラスを生成するのは、
非常に単純でtype関数を使えばできる。
type関数は[クラス名]、[親クラスのタプル(多重継承も可)]、[付与したい属性の辞書]で
動的にクラス生成をできる。


import unittest

def create_testmethod():
    """
    テストメソッドを動的に生成
    """
    def testMethod(self):
        self.assertEquals(1,1)
    return testMethod

def create_testclass():
    """
    TestCaseのサブクラスを動的に生成
    """
    test_class = type('TestA', (unittest.TestCase,), {})
    setattr(test_class,'testMethod',create_testmethod())
    return test_class

def suite():
    """
    テストスイートを生成
    """
    suite = unittest.TestSuite()
    test_class = create_testclass()
    suite.addTest(unittest.makeSuite(test_class))
    return suite

if __name__ == "__main__":
    unittest.TextTestRunner().run(suite())


動的にテストクラス(unittest.TestCaseのサブクラス)を生成して、
動的にテストメソッドを追加することができる。
これを応用すればソースコード書かずにテストクラス、テストメソッドを動的に追加するようなプログラムができる。



Quick Lookup: