python中的参数化单元测试

时间:2012-02-24 23:57:52

标签: python unit-testing nose pytest

我正在研究一组python单元测试,这些测试目前是使用构建在测试框架中的pythons构建的。我想编写参数化测试,根据我提供的数据集执行多次。

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

def test(data):
    if data > 0:
       #Pass the test

根据我的理解,目前在内置框架中这是不可能的,除非我在我的测试函数中放置一个循环。我不想这样做,因为即使一个输入失败,我也需要测试继续执行。

我已经看到可以使用nose或pyTest。哪个是最好的框架?是否有另一个我可以使用的框架比其中任何一个更好?

提前致谢!

2 个答案:

答案 0 :(得分:6)

请注意,这正是最近在 py.test 中添加funcargs的最常见用法之一。

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

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 是参数化单元测试的一个很好的框架......

答案 1 :(得分:1)

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

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()

问题Python unittest: Generate multiple tests programmatically?对此进行了更多的讨论,包括another approach通过动态创建测试用例的多个实例到测试套件中来实现同样的目的。