繁体   English   中英

python单元测试以测试循环而不中断

[英]python unit testing to test over the loop and not to break

def test2_1_wiered_chars(self):
    for char in l_wchar:
      self.assertFalse(is_number(char), msg='failed for char {}'.format(char) )

我正在将列表传递给函数is_number以检查它是否不是数字。 该列表包含字母和数字的组合。 当测试达到预期的第一个数字时,测试将失败。 但是它突围而出,并且没有显示它如何与列表的其余索引一起工作。 在一个测试案例中测试列表的所有值的正确方法是什么?

您不应在一个测试用例中拥有所有测试数据。 测试数据应在测试用例外部。 这应该适合您的目的:

class CharTests(unittest.TestCase):
    pass

def test_gen(char):
    def test_method(self):
        return self.assertTrue(char.isdigit())
    return test_method

if __name__ == '__main__':

    for index, char in enumerate(l_wchar):
        test_name = 'test_{0}'.format(index)
        test = test_gen(char)
        setattr(CharTests, test_name, test)

    suite = unittest.TestLoader().loadTestsFromTestCase(CharTests)
    result = unittest.TextTestRunner(verbosity=2).run(suite)

对于字符串中的每个字符,将一个测试用例方法添加到CharTests类中,然后执行该套件。 这将为您提供详细信息,哪些测试用例失败

def test2_1_wiered_chars(self)
  numbers = [char for char in l_wchar if is_number(char)]
  self.assertFalse(numbers, msg='failed for char(s) {}'.format(numbers))

为失败的对象创建一个新列表,并在完成后断言新列表为空。 空列表是错误的,因此如果列表中有任何整数,这将失败。

注意:如果l_wchar很大并且包含很多数字,则可能会导致内存效率l_wchar 制作两个副本可能不可行或不可能。

assert的目的与您尝试做的相反。 在测试某项内容时(在您的情况下,如果字符列表中有一个数字)并且某处失败一次 ,则继续运行该测试没有任何意义-该测试已经失败。

如果您想知道char是数字的所有情况,则应将代码更改为

results = []
for char in l_wchar:
    if is_number(char):
        msg='failed for char {}'.format(char)
        print msg
        results.append(True)

然后,您将得到一个列表,其中所有值为True索引对应于另一个列表中的数字。

要继续asserting即说明测试是否失败),只需在最后完成

assertFalse(any(results))

但是,请务必注意,这不是有效且正确的测试。 您不必测试所有内容即可知道测试是否失败。 第一次出现意外情况时,测试应失败 (并停止)。

暂无
暂无

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

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