Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么pytest_generate_tests钩子会给出一个';未找到夹具';错误,而它定义了一个夹具?_Python_Pytest - Fatal编程技术网

Python 为什么pytest_generate_tests钩子会给出一个';未找到夹具';错误,而它定义了一个夹具?

Python 为什么pytest_generate_tests钩子会给出一个';未找到夹具';错误,而它定义了一个夹具?,python,pytest,Python,Pytest,我想通过pytest\u generate\u测试使用外部数据(参数)实现以下内容。此示例适用于: @pytest.mark.parametrize('case', [1,2,3,4]) def test_regression(case): print case assert True 想象一下,我通过argv选项检索测试数据。因此,我创建了conftest.py,添加了选项--data,添加了fixturedata,并添加了pytest\u generate\u testsh

我想通过pytest\u generate\u测试使用外部数据(参数)实现以下内容。此示例适用于:

@pytest.mark.parametrize('case', [1,2,3,4])
def test_regression(case):
    print case
    assert True
想象一下,我通过argv选项检索测试数据。因此,我创建了conftest.py,添加了选项
--data
,添加了fixture
data
,并添加了
pytest\u generate\u tests
hook。请注意,如果我不声明
data
fixture,这将不起作用(但在示例中没有fixture声明):

例如,我有参数数据,它本身包含一些测试数据和一些测试用例。因此,我用以下方式定义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
上面的示例将给出一个错误:未找到夹具“案例”。但是如果我用
数据
替换
案例
,它会起作用:

# 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

但是我需要名为
case
的测试参数。我做错了什么?

我今天面临着几乎相同的问题:

我不能给出实际的根本原因,但问题似乎是传递给测试函数的函数参数应该是一个fixture。因此,如果您使用的是
数据
,它的工作原理与您使用的夹具相同

如果您使用的是
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
这将抛出
fixture'func'not found
错误。我通过添加以下行解决了此问题:

@pytest.fixture
def func(request):
    return request.param  # pass the param to the test function
我在文档中没有找到需要提供此功能的内容

我还注意到,再次取消对fixture的注释可以让代码仍然工作。我想这和缓存有关

@pytest.fixture
def func(request):
    return request.param  # pass the param to the test function