0

这是问题的迷你版

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 是等价的。

我正在使用单元测试和鼻子测试来运行它们如果我只想针对另一个表测试一个表,我会执行以下操作:

函数 truth() 创建我的表

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

但我的目标是针对我创建的所有其他表(大约 20 个并且还在增长)测试所有表。一些我无法解决的问题(我不确定我是否需要阅读单元测试文档或鼻子测试,或者甚至不需要它们!)

我的猜测是只使用更多的 for 循环来消除任何可能性。但是使用

>>> 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))
4

3 回答 3

0

尝试这种方法:在测试方法之外运行外部循环,而不是在测试方法中运行循环。内部代码应该向测试类添加新的测试方法。

请参见此处的示例:如何在 python 中生成动态(参数化)单元测试?

于 2012-05-16T08:43:40.623 回答
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)

map可以说,这可以使用像and这样的函数更优雅地完成,zip但重点是将代码分解成更小的片段并减少循环的深度。

于 2012-05-16T08:54:05.253 回答
0

一种更简单的方法是使用 unittest 的assertItemsEqual,它正是为此目的而设计的。给定 OP'sa, 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
于 2013-02-05T06:54:17.147 回答