2009-07-28 8 views
21

可能性の重複:
How to generate dynamic (parametrized) unit tests in python?Pythonのunittestのと動的に作成

動的unittestテストケースを作成する方法はありますか?私は( "0テストを実施しました(彼らはdir()に表示し、呼び出し可能です)正しくすべてのメソッドを作成しますが、のunittestのテスト検出器、またnosetestがそれらを実行..which ..

class test_filenames(unittest.TestCase): 

    def setUp(self): 
     for category, testcases in files.items(): 
      for testindex, curtest in enumerate(testcases): 
       def thetest(): 
        parser = FileParser(curtest['input']) 
        theep = parser.parse() 
        self.assertEquals(theep.episodenumber, curtest['episodenumber']) 

       setattr(self, 'test_%s_%02d' % (category, testindex), thetest) 

を次のことを試してみました。.. 。でepisodenumberに簡略化されたデータを(

を私はテストデータ、入力ファイル名のリストを含むファイルを持っている、と予想される: - ")私は間違った質問をすることができるので

私が達成しようとしていますどのような上記のコード)、Python辞書に格納されています。キーは、各テストにself.assertEqualsを呼び出して、すべてのデータの上に..

test_cases = {} 
test_cases['example_1'] = [ 
    {'input': 'test.01', 
    'episodenumber': 1}, 
    {'input': 'test.02', 
    'episodenumber': 2} 
] 

test_cases['example_2'] = [ 
    {'input': 'another.123', 
    'episodenumber': 123}, 
    {'input': 'test.e42', 
    'episodenumber': 32} 
] 

現在、私はちょうどループたとえば、値がテストケースの一覧で、カテゴリです。問題は、いずれかが失敗した場合、残りの失敗が1つのテストにグループ分けされるため、残りの部分が表示されず、アサーションが失敗したときに中止されます。

私は、各テストケースごとに(動的に)関数を作成することを考えましたが、おそらくもっと良い方法がありますか?

答えて

12

これは、鼻にテストgeneratorsを使用する必要があります。あなたがする必要があるのは、タプルを生成することだけです。最初のものは関数、残りはタプルです。ここの文書からは例があります。

def test_evens(): 
    for i in range(0, 5): 
     yield check_even, i, i*3 

def check_even(n, nn): 
    assert n % 2 == 0 or nn % 2 == 0 
+0

pytest(http://pytest.org/は)あまりにも発電機ベースのテストをサポートしています。 –

+0

+1参考リンク---この質問や他の質問に関する同様の回答のリンクにはそのリンクがありませんでした。 –

21

次の解決策では、クラスTestsにはヘルパーメソッドcheckが含まれ、静的に定義されたテストケースはありません。次に、テストケースを動的に追加するために、私はsetattrを使ってクラス内の関数を定義します。次の例では、iとjがそれぞれ[1,3]と[2,5]に及ぶテストケースtest_<i>_<j>を生成します。ヘルパーメソッドcheckをiとjの異なる値で使用しています。

class Tests(unittest.TestCase): 
    def check(self, i, j): 
     self.assertNotEquals(0, i-j) 



for i in xrange(1, 4): 
    for j in xrange(2, 6): 
     def ch(i, j): 
      return lambda self: self.check(i, j) 
     setattr(Tests, "test_%r_%r" % (i, j), ch(i, j)) 
関連する問題