为什么 pytest_generate_tests 钩子在定义夹具时会给出“未找到夹具”错误?

ava*_*sin 2 python pytest

我想通过 pytest_generate_tests 使用外部数据(参数)实现以下内容。这个例子有效:

@pytest.mark.parametrize('case', [1,2,3,4])
def test_regression(case):
    print case
    assert True
Run Code Online (Sandbox Code Playgroud)

想象一下,我通过 argv 选项检索测试数据。所以,我创建了 conftest.py,添加了 option --data,添加了夹具data和添加了pytest_generate_tests钩子。请注意,如果我不声明data夹具这将不起作用(但在示例中没有夹具声明):http : //pytest.org/latest/example/parametrize.html#generating-parameters-combinations-depending - 在命令行

import pytest

def pytest_addoption(parser):
    parser.addoption('--data', action='store', default='', help='Specify testing data')

@pytest.fixture
def data(request):
    return request.config.getoption('--data')

def pytest_generate_tests(metafunc):
    if 'data' in metafunc.funcargnames:
        # imagine data.cases = [1,2,3,4,5]
        metafunc.parametrize('case', [1,2,3,4,5]) 
Run Code Online (Sandbox Code Playgroud)

例如,我有参数数据,其中包含一些测试数据和一些测试用例。所以,我通过以下方式定义 conftest.py:

# conftest.py
import pytest

def pytest_addoption(parser):
    parser.addoption('--data', action='store', default='', help='Specify testing data')

@pytest.fixture
def data(request):
    return request.config.getoption('--data')

def pytest_generate_tests(metafunc):
    if 'data' in metafunc.fixturenames:
        # lets imagine data.cases = [1,2,3,4,5]
        metafunc.parametrize('case', [1,2,3,4,5])    

# test.py (just removed @pytest.mark.parametrize line)
def test_regression(case):
    print case
    assert True
Run Code Online (Sandbox Code Playgroud)

上面的例子会给出一个错误:fixture 'case' not found。但如果我casedata它代替它会起作用:

# conftest.py
import pytest

def pytest_addoption(parser):
    parser.addoption('--data', action='store', default='', help='Specify testing data')

@pytest.fixture
def data(request):
    return request.config.getoption('--data')

def pytest_generate_tests(metafunc):
    if 'data' in metafunc.fixturenames:
        # lets imagine data.cases = [1,2,3,4,5]
        metafunc.parametrize('data', [1,2,3,4,5])    

# test.py (just removed @pytest.mark.parametrize line)
def test_regression(data):
    print case
    assert True
Run Code Online (Sandbox Code Playgroud)

但我需要名为case. 我在做什么错?

mag*_*gie 5

我今天遇到了几乎同样的问题:

我不能给你真正的根本原因,但问题似乎是传递给测试函数的函数参数应该是一个固定装置。因此,如果您正在使用data它,它就像您使用夹具一样工作。

如果您使用的case是没有找到固定装置,case. 我通过执行以下操作解决了这个问题:

def pytest_generate_tests(metafunc):
    if 'func' in metafunc.fixturenames:
        # do some stuff
        metafunc.parametrize('func', all_combinations)

def test_function_prototypes(func):
    assert func
Run Code Online (Sandbox Code Playgroud)

这将抛出fixture 'func' not found错误。我通过添加以下几行来解决它:

@pytest.fixture
def func(request):
    return request.param  # pass the param to the test function
Run Code Online (Sandbox Code Playgroud)

我没有在文档中找到有关需要提供此功能的内容。

我还观察到再次取消对夹具的注释可以让代码仍然工作。我猜它与缓存有关......