如何对大量数据测试相同的断言

16 投票
7 回答
6928 浏览
提问于 2025-04-16 05:22

我正在使用Python的unittest模块来进行一些测试,但这个过程非常重复。

我有很多数据想要反复测试,检查它们是否正确。然而,我必须为每一组数据都定义一个测试。

举个例子,我想做类似这样的事情。我知道我可以用生成器来实现(在之前的讨论中看到过)。但是有没有其他的选择,甚至可以使用不同的测试模块呢?

任何建议都非常欢迎。


import unittest

class TestData(unittest.TestCase):
    def testNumbers(self):
        numbers = [0,11,222,33,44,555,6,77,8,9999]
        for i in numbers:
            self.assertEqual(i, 33)

7 个回答

10

从Python 3.4开始,你可以使用 unittest.TestCase.subTest(msg=None, **params) 这个上下文管理器(可以查看文档)。这样你只需要添加一条语句,就能实现你想要的功能。

下面是你提供的例子,已经修改为使用 subTest() 的版本。

import unittest

class TestData(unittest.TestCase):
    def testNumbers(self):
        numbers = [0, 11, 222, 33, 44, 555, 6, 77, 8, 9999]
        for i in numbers:
            with self.subTest(i=i):  # added statement
                self.assertEqual(i, 33)
11

比尔·格里布尔建议的解决方案的示例代码可能看起来像这样:

import unittest

class DataTestCase(unittest.TestCase):
    def __init__(self, number):
        unittest.TestCase.__init__(self, methodName='testOneNumber')
        self.number = number

    def testOneNumber(self):
        self.assertEqual(self.number, 33)

    def shortDescription(self):
        # We need to distinguish between instances of this test case.
        return 'DataTestCase for number %d' % self.number


def get_test_data_suite():
    numbers = [0,11,222,33,44,555,6,77,8,9999]
    return unittest.TestSuite([DataTestCase(n) for n in numbers])

if __name__ == '__main__':
    testRunner = unittest.TextTestRunner()
    testRunner.run(get_test_data_suite())
2

在另一个帖子中,我偶然发现了Nose Tests,这个工具更适合数据驱动的测试。


class Test_data():
    def testNumbers():
        numbers = [0,11,222,33,44,555,6,77,8,9999]
        for i in numbers:
            yield checkNumber, num

def checkNumber(num):
    assert num == 33

上面的代码和我第一篇帖子里的代码做的事情完全一样。你不需要导入任何东西,只需要写一个Python类。

你可以通过输入以下命令来执行测试:

nosetests 文件名

撰写回答