6

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

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

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

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

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

提前致谢!

4

2 回答 2

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

于 2012-03-16T10:22:55.513 回答
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:以编程方式生成多个测试?对此进行了更多讨论,包括另一种通过将测试用例的多个实例动态创建到测试套件中来实现相同目的的方法。

于 2012-02-25T13:52:59.763 回答