Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/16.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 3.x Pytest参数化从conftest.py中的cmdline选项生成的列表的测试_Python 3.x_Pytest - Fatal编程技术网

Python 3.x Pytest参数化从conftest.py中的cmdline选项生成的列表的测试

Python 3.x Pytest参数化从conftest.py中的cmdline选项生成的列表的测试,python-3.x,pytest,Python 3.x,Pytest,我正在尝试参数化从 conftest.py中的cmdline选项 #/usr/bin/env python 导入pytest 导入测试 def pytest_addoption(解析器): addoption(“--low”,action=“store”,type=int,help=“low”) addoption(“--high”,action=“store”,type=int,help=“high”) @fixture(scope=“session”,autouse=True) def用户(

我正在尝试参数化从 conftest.py中的cmdline选项

#/usr/bin/env python
导入pytest
导入测试
def pytest_addoption(解析器):
addoption(“--low”,action=“store”,type=int,help=“low”)
addoption(“--high”,action=“store”,type=int,help=“high”)
@fixture(scope=“session”,autouse=True)
def用户(请求):
return request.config.getoption(“低”)
@fixture(scope=“session”,autouse=True)
def范围(请求):
return request.config.getoption(“高”)
#test_file.py
def数据(低、高):
返回列表(范围(低、高))
@pytest.mark.parametize(“num”,数据(10,20))
def测试(数值):
断言数<1000
我想运行一个类似“pytest--low=10--high=100 test\u file.py”的命令。代码使用@pytest.mark.parametrize(“num”,data(x,y))在x和y之间的值范围内运行良好。我不想在参数化中提供低和高以外的任何值。如果我编写@pytest.mark.parametrize(“num”,data(low,high))之类的代码,它会抛出一个错误。有没有办法让我做这个参数化工作?我知道当我们在方法之外生成列表时,代码是有效的。但我想写一个生成列表的方法,并在参数化中使用该列表


是否有任何方法可以访问test_file.py中的任何位置的这些低位和高位cmdline选项?

您可以使用钩子参数化测试。使用钩子,您将可以访问命令行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))

另一种可能是通过
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

元功能方法正在发挥作用。非常感谢。是否有任何方法可以访问test_xx.py文件中的pytest参数而不使用fixture?在旧版本中,我们通常通过使用名称空间来实现这一点,但现在由于名称空间越来越不受欢迎,是否有其他方法来访问这些变量值?我知道def func(低、高),我正在寻找其他方法。通过
请求
fixture访问配置对象现在看来是最值得期待的方法。但是,没有人可以阻止您将自己的属性附加到
pytest
模块本身,例如在
pytest\u configure
hook中调用
pytest.lo=config.getoption('low')
。然后,您可以通过tests中的任何位置访问参数
pytest.lo
,将您自己的全局变量附加到
pytest
模块似乎是替换
pytest\u命名空间
内容的推荐方法。
# test_file.py

def test_spam(num):
    assert num
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