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

Mar*_*ark 12 python unit-testing python-unittest

我使用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)
Run Code Online (Sandbox Code Playgroud)

Dzi*_*inX 10

Bill Gribble建议的解决方案示例代码如下所示:

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


Bil*_*ble 5

您可能需要考虑使用unittest.TestSuite类,它将允许您动态构造一组将单独运行的unittest.TestCase实例.您的unittest.TestCase子类应该只定义一个测试方法,该类接受一个构造参数,该值传入该值以针对该特定实例进行测试.


Mr.*_*ess 5

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


Mar*_*ark 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
Run Code Online (Sandbox Code Playgroud)

上面的代码与我的第一篇文章的作用完全相同。不需要导入,只需编写一个 python 类即可。

您可以通过键入以下内容来执行测试:

nosetests filename