勝手にテストクラスにテストケース(つまりテストメソッド)が追加される、
とかそういうことをやりたい。
で、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: