python中的参数化单元测试

python中的参数化单元测试,python,unit-testing,nose,pytest,Python,Unit Testing,Nose,Pytest,我负责一组python单元测试,这些测试目前是使用python内置测试框架构建的。我想编写参数化测试,根据我提供的数据集执行多次 例如,如果我的数据集是[1,2,3,4],我的测试函数将使用数据集中的输入运行四次 def test(data): if data > 0: #Pass the test 据我所知,这在内置框架中目前是不可能的,除非我在测试函数中加入一个循环。我不想这样做,因为我需要测试继续执行,即使一个输入失败 我已经看到可以使用nose或pyTest

我负责一组python单元测试,这些测试目前是使用python内置测试框架构建的。我想编写参数化测试,根据我提供的数据集执行多次

例如,如果我的数据集是[1,2,3,4],我的测试函数将使用数据集中的输入运行四次

def test(data):
    if data > 0:
       #Pass the test
据我所知,这在内置框架中目前是不可能的,除非我在测试函数中加入一个循环。我不想这样做,因为我需要测试继续执行,即使一个输入失败

我已经看到可以使用nose或pyTest进行测试。使用哪种框架最好?我是否可以使用另一个比这两者都好的框架


提前谢谢

您可以通过以下方式基于数据集动态创建测试:

import unittest

data_set = [1,2,3,4]

class TestFunctions(unittest.TestCase):
    pass  # all your non-dynamic tests here as normal

for i in data_set:
    test_name = "test_number_%s" % i # a valid unittest test name starting with "test_"
    def dynamic_test(self, i=i):
        self.assertTrue(i % 2)
    setattr(TestFunctions, test_name, dynamic_test)

if __name__ == '__main__':
    unittest.main()

这个问题对此有更多的讨论,包括通过在一个测试套件中动态创建测试用例的多个实例来实现相同的功能。

请注意,这正是最近添加的inpy.test的最常见用途之一

在你的情况下,你会得到:

def pytest_generate_tests(metafunc):
    if 'data' in metafunc.funcargnames:
        metafunc.parametrize('data', [1,2,3,4])

def test_data(data):
    assert data > 0
[编辑]我应该补充一点,您也可以简单地

@pytest.mark.parametrize('data', [1,2,3,4])
def test_data(data):
    assert data > 0
所以我想说,py.test是参数化单元测试的一个很好的框架