unittest中的for循环

20 投票
3 回答
17751 浏览
提问于 2025-04-28 11:51

有没有办法让Python的unittest在一个方法里执行所有的检查(断言),并显示所有失败的情况,而不是在第一个失败的时候就停止?

class MyTestCase(TestCase):
    def test_a(self):
        with open('testcase.txt') as ifile: 
            for iline in ifile:
                self.assertEqual(iline, 'it is a test!')
暂无标签

3 个回答

1

一般来说,单元测试在遇到第一个失败时就会停止。如果你想比较所有的行,你需要先准备一个本地的列表,然后把不同的行放到这个列表里。最后,你可以检查这个列表的长度是否为零,或者使用一个本地的布尔变量来判断。

5

另外,你可以借助ddt这个包来创建一个数据驱动测试

DDT(数据驱动测试)让你可以通过使用不同的测试数据来重复运行一个测试案例,这样就能把它看作多个测试案例。

import unittest
from ddt import ddt, data

@ddt
class FooTestCase(unittest.TestCase):
    @data('it is a test!', 'it is a test!', 'something else')
    def test_lines(self, value):
        self.assertEqual(value, 'it is a test!')

ddt还可以从文件中获取数据,不过这个文件必须是JSON格式的。

26

Python 3.4 引入了一个叫做 subTest 的工具。使用这个工具后,你的代码看起来会像这样:

class MyTestCase(TestCase):
    def test_a(self):
        with open('testcase.txt') as ifile: 
            for iline in ifile:
                with self.subTest(line=iline):
                    self.assertEqual(iline, 'it is a test!')

如果不使用 subTest,想要实现同样的效果就比较麻烦了。你需要在一个 try 块里调用 self.assert*,然后打印出捕获到的错误。如果至少有一个测试失败了,你还得在循环结束后手动抛出一个 AssertionError 错误。这样做就显得很繁琐。

撰写回答