1

我是 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 钩子。我在想可能有更简单的方法来做到这一点?

4

1 回答 1

1

收集测试时执行 pytest_generate_tests 钩子。执行测试时调用 pytest_funcarg__data 工厂。测试执行发生在测试收集之后,因此您无法在收集期间调用诸如“getfuncargvalue”之类的东西。

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

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

HTH。霍尔格

于 2012-04-14T23:21:15.637 回答