###質問
unittestのテストクラスへテスト項目を動的に追加したく思っております。
やりたいこととしては、テストクラス外のデータを元にしてテスト項目を増減させたいのです。
(こういう行為は、unittestにふさわしくない考え方かもしれないですが・・・)
簡単には、テストクラス内のメソッド
(def test_1(self),def test_2(self)....)をテスト実行時に動的に追加する、というイメージです。
こういった場合、どういった方法が取れるでしょうか?
###試したこと
手段を調べる良いキーワードが思いつかず、結局泥臭いやり方しか分かりませんでした。
- execによる文字列からの動的な関数の生成
- Monkey_patchによるテストクラスへのテストメソッドの注入
特にexecで文字列を関数化している部分は、もっと他にやり方あるだろ!と感じておりますが、分かりませんでした。
うまいやり方をご存じの方にご教示願いたいです。
泥臭いやり方で実装したコードはこれです。ユニットテストの実行前にテストメソッドを10個追加します。
python
1import unittest 2 3class TestMyTest(unittest.TestCase): 4 5 def setUp(self): 6 pass 7 8 def tearDown(self): 9 pass 10 11 def test_origin(self): 12 self.assertEqual("test_1","test_1") 13 14if __name__ == "__main__": 15 for i in range(10): 16 name = "test_func" + str(i) 17 18 #文字として関数定義を書き起こす / 変数から名称を作れる 19 str_for_exec = "def {0}(self): self.assertEqual('{0}','{0}')".format(name) 20 exec(str_for_exec) # 関数が定義された 21 22 #テストクラスへ注入する 23 str_monkey_patch = "TestMyTest.{0} = {1}".format(name, name) 24 exec(str_monkey_patch) 25 26 unittest.main()
泥臭いながらunittestは想定通り動き、パスしました。
text
1#実行結果 2........... 3---------------------------------------------------------------------- 4Ran 11 tests in 0.000s 5 6OK
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/05 15:19
2016/11/05 15:52
2016/11/05 15:55