2012-05-16 534 views
0

這裏的問題迷你版如何測試和記錄多次-nosetest單元測試 - 蟒蛇

a = [[1,2,3][0,0,0]] 
b = [[1,0,1][0,0,0]] 
c = [[0,0,0][1,0,1]] 

所以如果1級[]和2級爲[[]],然後就是我試圖做的是測試以往的列表,看看是否有級別2的匹配(不管順序),所以在這種情況下,b,c是等價的。

我使用單元測試和nosetests運行它們 如果我想只是測試一個表對另一個我會做這樣的事情:

功能真相()創建我的表

def test_table1_table2(self): 
    for row in truth(1,3): 
     self.assertIn(row,truth(2,4)) 

但我的目標是對照我創建的所有其他表(大約20和增長)測試所有表。有些問題我無法解決(我不確定是否需要閱讀單元測試文檔或nosetest或甚至不需要它們!)

我的猜測是隻使用更多的循環拉出的可能性。但是,使用

>>> nosetest 

assertIn 

只是停止在第一個錯誤,這是不是我想要的。我需要掃描並收集哪些列表相同的信息(無論順序或嵌套列表)。也許我應該創造一些東西,忘記單元測試?

,所以我首選的輸出會是這樣的

table1 and table2 are not equivalent 
table1 and table2 are not equivalent 

或可能更有用和更短的也只是

table1 and table10 are equivalent 

下面是代碼目前,我有,幾乎一切都只是有一個整數期望真值()使真值表(嵌套列表):

114  def test_all(self):$             |~      
115   ''' will test all tables'''$          |~      
116   for expression in range(self.count_expressions()):$    |~      
117    num_var = count_vars(exp_choose(expression))$     |~      
118    for row in truth(expression, num_var):$      |~      
119     for expression2 in range(self.count_expressions()):$  |~      
120      num_var2 = count_vars(exp_choose(expression2))$  |~      
121      for row2 in truth(expression2, num_var2):$   |~      
122       self.assertIn(row, truth(expression2,num_var2)) 

回答

0

一個更簡單的方法是使用unittest的assertItemsEqual,這是專門爲此目的而設計的。鑑於O.P.的a,b,& c嵌套列表:

class CheckingEqualityIgnoreOrder(unittest.TestCase): 
    def testAB(self): 
     self.assertItemsEqual(a, b) 
     #fails 

    def testBC(self): 
     self.assertItemsEqual(b, c) 
     #passes 

    def testAC(self): 
     self.assertItemsEqual(a, c) 
     #fails 
0

更新爲更短的解決方案:

def match(a,b): 
    aSets = map(set, a) 
    bSets = map(set, b) 
    return ((aSets[0] == bSets[0]) and (aSets[1] == bSets[1])) \ 
     or ((aSets[0] == bSets[1]) and (aSets[1] == bSets[0])) 

tables = {} 
tables['a'] = [[1,2,3],[0,0,0]] 
tables['b'] = [[1,0,1],[0,0,0]] 
tables['c'] = [[0,0,0],[1,0,1]] 
tables['d'] = [[0,0,0],[1,1,0]] 

for key1, value1 in tables.items(): 
    for key2, value2 in tables.items(): 
    result = 'equivalent' if match(value1,value2) else 'not eqivalent' 
    print '%s and %s are %s' % (key1, key2, result) 

這可以說是很多更優雅的使用像mapzip功能完成,但關鍵是要打破代碼以較小的片段並減少循環的深度。