以下是问题的迷你版
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是等价的。
我正在使用unittesting和nosetests来运行它们 如果我只想测试一个表与另一个表,我会做类似的事情:
函数truth()创建我的表
def test_table1_table2(self):
for row in truth(1,3):
self.assertIn(row,truth(2,4))
但我的目标是针对我创建的所有其他表(大约20个并且正在增长)测试所有表。一些问题我无法解决(我不确定我是否需要阅读unittest docs或nosetests,甚至不需要它们!)
我的猜测是只使用更多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))
答案 0 :(得分:0)
尝试这种方法:在测试方法之外运行外部循环而不是测试方法中的循环。内部代码应该为测试类添加新的测试方法。
请点击此处查看示例:How to generate dynamic (parametrized) unit tests in python?
答案 1 :(得分: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
和zip
这样的函数可以更优雅地完成这一点,但关键是要用较小的片段分解代码并减少循环的深度。
答案 2 :(得分: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