2009-07-28 130 views
21

可能重複:
How to generate dynamic (parametrized) unit tests in python?Python的單元測試和動態創建測試用例

有沒有一種方法可以動態地創建unittest測試用例?我曾嘗試以下..

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) 

..這正確創建的所有方法(他們dir()顯示和可調用),但單元測試的測試探測器,也nosetest執行他們(「在冉0測試.. 。「)

因爲我可能會問錯了問題 - 我想實現:

我有一個包含測試數據,輸入文件名列表的文件,和預期的數據(在簡化episodenumber上面的代碼),存儲在一個Python字典中。關鍵是該類別的值是測試案例的列表,例如..

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} 
] 

目前我剛剛超過所有的數據環路,呼籲self.assertEquals每個測試。問題是,如果失敗了,我不會看到其餘的失敗,因爲它們也被分組到一個測試中,當斷言失敗時它會中止。

解決這個問題的辦法,我認爲,將是(動態)爲每個測試用例的功能,也許有更好的辦法嗎?

回答

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/)也支持基於生成器的測試。 – 2009-07-28 16:25:57

21

在下面的方案中,所述類Tests包含check和沒有測試案例靜態定義的輔助方法。然後,爲了動態添加測試用例,我使用setattr來定義類中的函數。在以下示例中,我生成測試用例test_<i>_<j>與i和j分別跨越[1,3]和[2,5],其使用助手方法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))