如何测试和记录多次noestest unittest python

2024-05-03 23:47:17 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个小版本的问题

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

Tags: andinself列表forcount级别num
3条回答

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

请参阅此处的示例:How to generate dynamic (parametrized) unit tests in python?

更简单的方法是使用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

更新为较短的解决方案:

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这样的函数可以更加优雅地实现这一点,但关键是将代码分解成更小的片段并减少循环的深度。在

相关问题 更多 >