我正在研究一组python单元测试,这些测试目前是使用构建在测试框架中的pythons构建的。我想编写参数化测试,根据我提供的数据集执行多次。
即。如果我的数据集是[1,2,3,4],我的测试函数将使用我的数据集中的输入运行四次。
def test(data):
if data > 0:
#Pass the test
根据我的理解,目前在内置框架中这是不可能的,除非我在我的测试函数中放置一个循环。我不想这样做,因为即使一个输入失败,我也需要测试继续执行。
我已经看到可以使用nose或pyTest。哪个是最好的框架?是否有另一个我可以使用的框架比其中任何一个更好?
提前致谢!
答案 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通过动态创建测试用例的多个实例到测试套件中来实现同样的目的。