我想通过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
挂钩。请注意,如果我没有声明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
上面的示例会给出错误:fixture' case'未找到。但如果我用case
替换data
,它将起作用:
# 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
的测试参数。我做错了什么?
答案 0 :(得分:4)
我今天遇到了几乎同样的问题:
我不能给你实际的根本原因,但问题似乎是传递给测试函数的函数参数应该是一个夹具。因此,如果您正在使用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' not found
错误。我通过添加以下几行解决了这个问题:
@pytest.fixture
def func(request):
return request.param # pass the param to the test function
我没有在文档中发现有关提供此功能的必要性。
我还观察到,再次取消注释夹具会使代码仍然有效。我想它与缓存有关...