Python unittest:对值列表运行相同的测试,但将它们视为单独的测试

时间:2018-10-19 02:07:39

标签: python python-3.x unit-testing python-unittest

我正在编写一个测试,以验证我的程序能够针对不同级别的复杂性解决当前的问题。预期的结果始终是相同的(解决方案是完整的),因此单个测试定义可解决所有问题。

如何为从文件中读取的值列表运行相同测试,但告诉unittest将这些问题中的每一个作为单独的测试进行处理这样我就可以查明所有失败/通过的案例?(最好没有外部库)

为了避免显式使用test_solution_1, test_solution_2... test_solution_n,我最初的想法是让for循环遍历列表的每个项目,并一次运行一个断言:

class TestProblem(unittest.TestCase):
    def test_all(self):
        results = Counter()
        rng = 50
        for i in range(rng):
            p = Problem(matrix_index=i)  # generate instance of problem.
            p.solve()
            results[p.is_complete()] += 1  # log result of test.
            self.assertTrue(p.is_complete(), msg="Failed at %s" % str(i))
        # Now ensure all instances passed (useful when above assertion not included).
        self.assertEqual(results[True], rng, msg="SCORE: %s / %s" % (results[True], rng))

这种方法的问题是,第一个故障会使其余的故障停止运行,因此更难于全面了解问题所在。

1 个答案:

答案 0 :(得分:0)

使用 subTest() 上下文管理器来区分单个测试正文中的测试。 (Python 3.4及更高版本)

    def test_all(self):
        results = Counter()
        rng = 50
        for i in range(rng):
            with self.subTest(i=i):  # <----------------------
                p = Problem(matrix_index=i)  # generate instance of problem.
                p.solve()
                results[p.is_complete()] += 1  # log result of test.
                self.assertTrue(p.is_complete())
        self.assertEqual(results[True], rng, msg="SCORE: %s / %s" % (results[True], rng))

PyCharm的结果:

PyCharm unittest subTest results

您可以查看每个案例的单个结果,并一次查看所有失败的案例。请注意,它仍然被视为单个逻辑测试(“ Ran 1测试”),这是合理的,因为它测试了相同的功能。每个案例都被视为子测试。


要考虑的其他事项:

  • 如果使用旧版本的Python或要使用其他库,则可以查看ddt通过装饰器@data(3, 4, 12, 23)添加测试数据。