我想要实现的是拥有一个装饰器,该装饰器将根据命令行参数来更改测试的运行方式:
import pytest
from functools import wraps
def magic():
# obtain extra_bit
extra_bit = ...
def wrapper(f):
if extra_bit:
@wraps(f)
def test_func(*args, **kwars):
f(*args, **kwars)
else:
@wraps(f)
def test_func(*args, **kwargs):
assert 0
return test_func
return wrapper
将此装饰器称为:
@magic(4)
def test_this():
assert 0
调用界面很重要,因为命令行参数不应出现在此处(因为装饰器的用户从不对其进行任何操作)。
(https://docs.pytest.org/en/latest/example/simple.html)
使命令行参数可以作为固定装置来测试pytest中的功能非常容易:
import pytest
def pytest_addoption(parser):
parser.addoption('--extra_bit', action='store_true')
@pytest.fixture
def extra_bit(request):
return request.config.getoption('--extra_bit')
然后在测试中使用它们
def test_this(extra_bit):
assert extra_bit
但是,这些固定装置仅在用于test_
函数的定义中时才起作用,而不适用于测试模块中的任意函数。
如果不通过test_
函数自变量/固定装置,如何从pytest获取命令行自变量?
答案 0 :(得分:0)
使用pytest_configure
可以使该选项在conftest.py
文件中可用。
import pytest
_EXTRA_BIT = False
def extra_bit():
return _EXTRA_BIT
def pytest_addoption(parser):
parser.addoption("--extra_bit", action="store_true")
def pytest_configure(config):
global _EXTRA_BIT
_EXTRA_BIT = config.getoption("--extra_bit")
from conftest import extra_bit
from functools import wraps
def magic():
# obtain extra_bit
extra_bit = extra_bit()
def wrapper(f):
if extra_bit:
@wraps(f)
def test_func(*args, **kwars):
f(*args, **kwars)
else:
@wraps(f)
def test_func(*args, **kwargs):
assert 0
return test_func
return wrapper
编辑:下面的旧答案使用了不推荐使用的pytest.config
模块。
因此,事实证明pytest确实通过pytest.config
模块提供了该功能。有关此文档,请参见:https://docs.pytest.org/en/latest/reference.html#_pytest.config.Config。一个可以使用的功能是getoption
函数。
import pytest
from functools import wraps
def magic():
# obtain extra_bit
extra_bit = pytest.config.getoption('--extra_bit')
def wrapper(f):
if extra_bit:
@wraps(f)
def test_func(*args, **kwars):
f(*args, **kwars)
else:
@wraps(f)
def test_func(*args, **kwargs):
assert 0
return test_func
return wrapper