Python 单元测试中的For循环
有没有一种方法可以告诉python unittest执行一个方法中的所有断言并显示它失败的所有情况,而不是在第一次失败时停止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!') 通常
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!')