2016-01-05 118 views
1
def test2_1_wiered_chars(self): 
    for char in l_wchar: 
     self.assertFalse(is_number(char), msg='failed for char {}'.format(char)) 

我正在傳遞一個列表功能is_number來檢查它是否不是一個數字。該列表具有字母和數字的組合。按預期擊中第一個數字時,測試失敗。但它打破了循環,並沒有顯示它如何與列表的其餘索引表現出來。在一個測試用例中測試列表的所有值的正確方法是什麼?蟒蛇單元測試循環測試和不打破

+0

Che this這個:http://stackoverflow.com/a/4744463/1113211。你可能會從這裏得到答案。 –

回答

0
def test2_1_wiered_chars(self) 
    numbers = [char for char in l_wchar if is_number(char)] 
    self.assertFalse(numbers, msg='failed for char(s) {}'.format(numbers)) 

創建失敗的對象的新列表,並在完成後聲明新列表爲空。空的列表是錯誤的,所以如果列表中有任何整數,這將失敗。

注意:如果l_wchar非常大並且包含大量數字,則這可能會導致內存效率極低。製作它的兩個副本可能不切實際或可能。

+0

感謝您的回覆。這將爲我的目的現在做我 –

+0

如果這個答案幫助你,請考慮點擊複選標記以表明它作爲答案。 – IanAuld

0

assert的目標與您正在嘗試的目標相反。當你測試某些東西時 - 例如,如果在字符列表中有一個數字 - 並且它在某處出現一次失敗,那麼測試繼續運行就沒有意義了 - 它已經失敗了。

如果你想知道的所有情況下的字符是一個數字,你應該將代碼更改爲類似

results = [] 
for char in l_wchar: 
    if is_number(char): 
     msg='failed for char {}'.format(char) 
     print msg 
     results.append(True) 

然後你就會有一個列表,其中有True作爲值的所有索引對應的數字在另一個列表中。

要繼續asserting即說明該測試是否失敗,只是做在最後

assertFalse(any(results)) 

但是,請注意,這不是一個有效的,正確的測試是非常重要的。您不必測試的所有內容以瞭解測試是否失敗。測試應該失敗(並停止)第一次意想不到的事情。

+0

感謝您的諮詢和回覆。 –

1

您不應該在單個測試用例中包含所有測試數據。測試數據應該在測試用例的外部。這應該爲你工作的目的:

class CharTests(unittest.TestCase): 
    pass 

def test_gen(char): 
    def test_method(self): 
     return self.assertTrue(char.isdigit()) 
    return test_method 

if __name__ == '__main__': 

    for index, char in enumerate(l_wchar): 
     test_name = 'test_{0}'.format(index) 
     test = test_gen(char) 
     setattr(CharTests, test_name, test) 

    suite = unittest.TestLoader().loadTestsFromTestCase(CharTests) 
    result = unittest.TextTestRunner(verbosity=2).run(suite) 

對於字符串中的每個字符,一個測試用例的方法追加到類CharTests,之後執行套件。這會很詳細地給你哪個測試用例失敗

+0

謝謝。對於我的測試框架工作研究將是一個很好的知識 –