Python 单元测试中的For循环

Python 单元测试中的For循环,python,unit-testing,testing,python-unittest,Python,Unit Testing,Testing,Python Unittest,有没有一种方法可以告诉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!') 通常

有没有一种方法可以告诉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!')

通常不会。单元测试在第一次失败时停止。如果要比较所有行,需要有一个本地列表,然后将不同的行放入列表中。然后断言列表长度为零。或局部布尔变量。

Python 3.4引入了上下文管理器。您的代码看起来像

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

如果没有
子测试
,实现这一点的丑陋方法是在
try
块中进行
self.assert*
调用,打印捕获的错误,如果至少有一个测试失败,则在循环后显式地提出
AssertionError

或者,您可以借助以下工具进行数据驱动测试:

DDT(数据驱动测试)允许您将一个测试用例乘以 使用不同的测试数据运行它,并使其显示为多个 测试用例


ddt
也可以有,但它必须是一个JSON文件。

我还没有看到一个累积错误并报告所有错误的单元测试框架。看来标准是第一次失败就失败。@TGH:我有;有
EXPECT
宏在出现故障时继续执行,有
ASSERT
宏立即中止。@user2357112 Ok。我想这是有道理的,因为它只是框架创建者做出的设计选择。我想一种常见的模式是在断言失败时抛出异常,如果需要,让调用方实现自己的异常计数。@lucemia subTest无疑是实现所需的最简单的方法,但您也可以在循环中使用
try..except
打印异常。子测试的问题是,不会自动为每个子测试调用
setUp
,这有时是必要的。但是,它当然可以在子测试中手动调用为
self.setUp()
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!')