我是py.test的新手,我在测试执行之前使用funargs生成一些测试数据。我想让pytest_generate钩子使用funcargs值并将其传递给测试函数。对于例如我有一个函数“do_something”,它查询数据库中的一组给定参数并相应地设置用户的环境。考虑到我们有多站点设置,我想确保数据库具有在测试执行之前执行测试的条目。
def pytest_funcarg__data(request):
# Ensure test data exist in the data base
# Perform all the checks
# Final values
values = [['option1', 'option2', 'option3'],
['option1', 'option2'],
['option2', 'option3']]
# Expected result
results = [['output1'],
['output2'],
['output3']]
return (values, results)
def test_do_something(value, result):
assert do_something(value) == result
理想情况下。我想迭代值并将它们传递给我的测试函数。我怎样才能做到这一点?
目前我这样做:
def pytest_funcarg__data(request):
#same as above
def pytest_funcarg__pass_data(request):
data = request.getfuncargvalue("data")
return (data[0][request.param],
data[1][request.param])
def pytest_generate_tests(metafunc):
if 'pass_data' in metafunc.funcargnames:
# If number of test cases change the change needs to made here too
metafunc.parametrize("pass_data", [0, 1, 2], indirect=True)
def test_do_something(pass_data):
assert do_something(pass_data[0] == pass_data[1]
现在,这有效。但每次我添加一个测试用例时,我都需要更新generate_test钩子。我想可能有一种更简单的方法可以做到这一点?
答案 0 :(得分:0)
收集测试时执行pytest_generate_tests钩子。执行测试时会调用pytest_funcarg__data工厂。测试执行发生在测试集合之后,因此在收集过程中无法调用类似“getfuncargvalue”的内容。
但是,从您的示例中不清楚为什么要同时使用它们 - 这是一个应该直接用于示例测试的generate_tests:
def pytest_generate_tests(metafunc):
params = [("input", "output")]
metafunc.parametrize(("test_case", "result"), params)
HTH。霍尔格