Python 在pytest_generate_tests函数中使用funcarg值

Python 在pytest_generate_tests函数中使用funcarg值,python,unit-testing,pytest,Python,Unit Testing,Pytest,我是py.test的新手,我正在使用funargs在执行测试之前生成一些测试数据。我想让pytest_生成hook使用funcargs值并将其传递给test函数。例如,我有一个函数“do_something”,它查询数据库中给定的一组参数,并相应地设置用户环境。考虑到我们有一个多站点设置,我想确保在执行测试之前,数据库中有测试所针对的条目 def pytest_funcarg__data(request): # Ensure test data exist in the data bas

我是py.test的新手,我正在使用funargs在执行测试之前生成一些测试数据。我想让pytest_生成hook使用funcargs值并将其传递给test函数。例如,我有一个函数“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_测试挂钩。我想可能有一种更简单的方法来实现这一点?

在收集测试时执行pytest\u generate\u tests钩子。执行测试时,将调用pytest_funcarg__数据工厂。测试执行发生在测试收集之后,所以在收集期间无法调用“getfuncargvalue”之类的内容

但是,从您的示例中不清楚为什么要同时使用这两种测试-下面是一个generate_测试,它应该直接与您的示例测试一起使用:

def pytest_generate_tests(metafunc):
    params = [("input", "output")]
    metafunc.parametrize(("test_case", "result"), params)

嗯。霍尔格

它怎么不起作用?请包括错误描述(和/或异常,如果有)。事实上,我想我知道是怎么回事,因为我刚刚花了两个小时进行了一些复杂的参数化——但这不是你懒惰的借口!错误是“metafunc没有名为getfuncargs的属性”。generate_测试也无法访问数据。感谢您的回复,我已经更新了我的原始问题以使其更清晰:)我认为这里有一个误解。您不需要pytest_funcarg_uupass_数据工厂。写一个pytest_generate_tests函数就足够了。是的,谢谢你清除了它,我现在已经删除了funcargs,并添加了数据库调用来pytest_generate它现在非常简单:)谢谢