我正在尝试参数化由 conftest.py中的cmdline选项。
#!/usr/bin/env python
import pytest
import test
def pytest_addoption(parser):
parser.addoption("--low", action="store", type=int, help="low")
parser.addoption("--high", action="store",type=int, help="high")
@pytest.fixture(scope="session", autouse=True)
def user(request):
return request.config.getoption("low")
@pytest.fixture(scope="session", autouse=True)
def rang(request):
return request.config.getoption("high")
#test_file.py
def data(low, high):
return list(range(low, high))
@pytest.mark.parametrize("num", data(10, 20))
def test(num):
assert num < 1000
我想运行类似“ pytest --low = 10 --high = 100 test_file.py”的命令。对于@x和y之间的值范围,使用@ pytest.mark.parametrize(“ num”,data(x,y))可以正常工作。除了低和高之外,我不想在参数化中提供任何值。如果我编写类似@ pytest.mark.parametrize(“ num”,data(low,high))之类的代码,则会引发错误。有什么办法可以使我完成这项参数化工作?我知道当我们在方法外部生成列表时代码可以工作。但是我想写一种生成列表并在参数化中使用该列表的方法。
有什么办法可以在test_file.py中的任何地方访问这些高低cmdline选项吗?
答案 0 :(得分:0)
您可以使用pytest_generate_tests
挂钩对测试进行参数化。有了这个钩子,您将可以访问命令行args。
# conftest.py
def pytest_addoption(parser):
parser.addoption("--low", action="store", type=int, help="low")
parser.addoption("--high", action="store",type=int, help="high")
def pytest_generate_tests(metafunc):
if 'num' in metafunc.fixturenames:
lo = metafunc.config.getoption('low')
hi = metafunc.config.getoption('high')
metafunc.parametrize('num', range(lo, hi))
# test_file.py
def test_spam(num):
assert num
另一种可能性是通过pytest.config
访问args,尽管请注意,这是一个已弃用的功能,将很快删除:
import pytest
def data():
lo = pytest.config.getoption('low')
hi = pytest.config.getoption('high')
return list(range(lo, hi))
@pytest.mark.parametrize('num', data())
def test_spam(num):
assert num