如何多次测试和记录-nosetest unittest - python

时间:2012-05-16 07:57:50

标签: python unit-testing for-loop nosetests

以下是问题的迷你版

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

3 个答案:

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

使用像mapzip这样的函数可以更优雅地完成这一点,但关键是要用较小的片段分解代码并减少循环的深度。

答案 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