对于unittest中的循环

luc*_*mia 8 python testing unit-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!')
Run Code Online (Sandbox Code Playgroud)

vau*_*tah 11

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!')
Run Code Online (Sandbox Code Playgroud)

实现这一目标的丑陋方法subTestself.assert*try块内进行调用,打印捕获的错误,并AssertionError在循环后显式提升(如果至少一个测试失败).

  • 子测试的问题在于,不会为每个子测试自动调用“setUp”,而有时这是必要的。然而,它当然可以在子测试中手动调用为“self.setUp()”。 (2认同)

ale*_*cxe 5

或者,您可以在package的帮助下进行数据驱动测试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!')
Run Code Online (Sandbox Code Playgroud)

ddt也可以有来自文件的数据,但它必须是 JSON 文件。