python - 为什么 pytest_generate_tests 钩子(Hook)在定义固定装置时给出 'fixture not found' 错误?

标签 python pytest

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

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

想象一下,我通过 argv 选项检索测试数据。因此,我创建了conftest.py,添加了选项--data,添加了固定装置data并添加了pytest_generate_tests钩子(Hook)。请注意,如果我不声明 data 固定装置,这将不起作用(但在示例中没有固定装置声明):http://pytest.org/latest/example/parametrize.html#generating-parameters-combinations-depending-on-command-line

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]) 

例如,我有参数数据,其中包含一些测试数据和一些测试用例。因此,我按以下方式定义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

上面的例子会报错:未找到固定装置“case”。但如果我用 data 替换 case 它将起作用:

# 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 的测试参数。我做错了什么?

最佳答案

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

我无法给您实际的根本原因,但问题似乎是传递给测试函数的函数参数预计是一个固定装置。因此,如果您使用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

这将引发未找到fixture 'func'错误。我通过添加以下行解决了这个问题:

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

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

我还观察到,再次取消注释该装置可以使代码仍然有效。我猜它与缓存有关......

关于python - 为什么 pytest_generate_tests 钩子(Hook)在定义固定装置时给出 'fixture not found' 错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26552978/

相关文章:

Python - 尝试比较两个格式不同的文本文件

python - Python 中 AndAlso (&&) 和 OrElse (||) 逻辑运算符的等效项是什么?

python - Yosemite 上的 Python 2.7.6 MySQLdb 问题

pytest - py.test 给出 Coverage.py 警告 : Module sample. py 从未导入

python - 覆盖具有参数的 FastAPI 依赖项

python - 在一行 django 模板中打印 for 循环输出

用 Nose : Making sequential tests 进行 Python 单元测试

python - 如何解决 pytest 中的弃用警告

python - pytest 是否支持在测试文件中使用函数工厂?

python - SQLAlchemy 在测试期间恢复 auto_increment (pytest)