繁体   English   中英

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

[英]How to test and log multiple times -nosetest unittest - python

这是问题的迷你版

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

我正在使用单元测试和鼻子测试来运行它们,如果我只想对另一个表进行测试,我会做类似的事情:

函数true()创建我的表

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

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

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

>>> nosetest 

与一个

assertIn 

只是在第一个错误处停止,这不是我想要的。 我需要扫描并收集有关哪些列表等效的信息(无论顺序或嵌套列表如何)。 也许我应该只是创建一些东西而忘记单元测试?

所以我的首选输出将是这样的

table1 and table2 are not equivalent 
table1 and table2 are not equivalent

或可能更有用且更短

table1 and table10 are equivalent

这是我目前拥有的代码,几乎所有东西都只是一个整数,期望的是true(),它使真值表(嵌套列表):

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

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

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

更新为更短的解决方案:

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等功能可以说可以更优雅地完成此操作,但是重点是将代码分解成较小的片段并减少循环的深度。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM