这是一个小版本的问题
a = [[1,2,3][0,0,0]]
b = [[1,0,1][0,0,0]]
c = [[0,0,0][1,0,1]]
所以如果级别1是[],级别2是[],那么我要做的是测试ever list,看看是否有级别2的匹配(不管顺序如何),所以在这个例子中b,c是等价的。在
我用单元测试和nosetests来运行它们 如果我只想测试一个表与另一个表,我会做如下操作:
函数truth()创建我的表
^{pr2}$但我的目标是根据我创建的所有其他表(大约20个,并且还在增长)测试所有表。有些问题我无法解决(我不确定我是否需要阅读unittest文档或nosetests,甚至不需要它们!)在
我的猜测是使用更多的for循环来提取任何可能性。但是使用
>>> nosetest
带着
assertIn
就停在第一个错误,这不是我想要的。我需要扫描和收集信息,在哪些列表是等效的(不管顺序或嵌套的列表)。也许我应该做点什么,忘掉单元测试?在
所以我的首选输出应该是
table1 and table2 are not equivalent
table1 and table2 are not equivalent
或者更有用更短的
table1 and table10 are equivalent
这是我目前的代码,几乎所有的东西都是一个整数expect truth(),它生成真值表(嵌套列表):
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))
尝试这种方法:在测试类之外运行外部循环,而不是测试方法内部的循环。内部代码应该向测试类添加新的测试方法。在
请参阅此处的示例:How to generate dynamic (parametrized) unit tests in python?
更简单的方法是使用unittest的assertItemsEqual,它正是为此目的而设计的。给定O.P.的a、b和c嵌套列表:
更新为较短的解决方案:
使用
map
和zip
这样的函数可以更加优雅地实现这一点,但关键是将代码分解成更小的片段并减少循环的深度。在相关问题 更多 >
编程相关推荐