2012-02-24 120 views
6

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

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

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

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

我已经看到可以使用鼻子或pyTest。哪个是最好的框架?我还有另外一个框架可以比这两个框架都好吗?

在此先感谢!

回答

6

请注意,这恰恰是最近添加funcargs的最常见用法之一,其中py.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是参数化单元测试的一个很好的框架...

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通过动态创建测试的多个实例实现同样的事情案件进入测试套件。