2014-10-20 83 views
5

有没有办法告诉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!') 
+1

我还没有看到一个单元测试框架,积累错误并将它们全部报告。看起来标准是在第一次失败时失败。 – TGH 2014-10-20 04:37:07

+1

@TGH:我有; [googletest](https://code.google.com/p/googletest/wiki/Primer)具有可在失败时继续运行的'EXPECT'宏和立即中止的'ASSERT'宏。 – user2357112 2014-10-20 04:44:01

+0

@ user2357112好有趣。我想这是有道理的,因为它只是框架创建者所做的设计选择。我猜一个常见的模式是当断言失败时抛出异常,如果需要的话,留给调用者实现他们自己的异常计数。 – TGH 2014-10-20 04:46:39

回答

7

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循环后明确,如果至少一个测试失败。

+0

我想我需要为Python 2.7找到一个子测试backport ... – lucemia 2014-10-20 04:41:47

+1

@lucemia subTest是无可争议的最简单的方法来实现你想要的,但你也可以在循环中使用'try..except'来打印异常。 – vaultah 2014-10-20 05:41:07

+0

子测试的问题在于不会为每个子测试自动调用'setUp',因为有时可能需要这样做。但是,它可以在子测试中自动调用为'self.setUp()'。 – 2017-05-01 20:14:20

1

一般没有。单元测试首先失败。如果您想比较所有行,您需要有一个本地列表,然后将不同的行放入列表中。然后断言列表长度为零。或者是一个本地布尔变量。

3

或者,你可以做一个数据驱动测试ddt package帮助:

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也可以有data coming from a file,但它必须是一个JSON文件。