pytest系列——内置fixture函数之pytestconfig详解
前言
pytestconfig
是pytest框架的一个内置fixture函数,可以获取上下文,它的作用跟 request.config
是一样的,代表pytest配置对象。
参照博客:pytest系列——内置fixture函数之request详解
pytestconfig的源代码
从源代码中可以看到: pytestconfig
fixture函数实际上的返回值为 request.config
即返回pytest配置对象。【在程序中可以通过配置对象的】
@fixture(scope="session")
def pytestconfig(request: FixtureRequest) -> Config:
"""Session-scoped fixture that returns the :class:`_pytest.config.Config` object.
Example::
def test_foo(pytestconfig):
if pytestconfig.getoption("verbose") > 0:
...
"""
return request.config
源代码实例:
def test_foo(pytestconfig):
if pytestconfig.getoption("verbose") > 0:
pytestconfig fixture函数中有2个比较常用的方法:
① pytestconfig.getoption 获取命令行参数(对应的参数值):【不但可以获取pytest框架中自带的命令行参数值,也可以获取用户注册的自定义参数值】
参考博客:pytest系列——pytest_addoption钩子函数添加自定义参数到pytest配置对象中+request.config.getoption获取参数值
conftest.py
import pytest
def pytest_addoption(parser):
parser.addoption(
"--cmdopt",
action="store",
default="默认参数值",
help="my option: type1 or type2"
)
@pytest.fixture()
def cmdopt(pytestconfig):
return pytestconfig.getoption("--cmdopt")
test_a.py
import pytest
def test_cmd_1(cmdopt): # 通过conftest.py文件中定义的fixture函数来获取自定义参数值,但是定义的fixture函数中原理依旧是调用了pytest内置fixture函数pytestconfig
print("test_cmd_1当前获取的参数为:{}".format(cmdopt))
def test_cmd_2(request):
cmdopt = request.config.getoption("cmdopt") # 直接通过调用pytest内置fixture函数request获取自定义参数值
print("test_cmd_2当前获取的参数为:{}".format(cmdopt))
def test_cmd_3(pytestconfig):
cmdopt = pytestconfig.getoption("cmdopt") # 直接通过调用pytest内置fixture函数pytestconfig获取自定义参数值
print("test_cmd_3当前获取的参数为:{}".format(cmdopt))
if __name__ == '__main__':
pytest.main(['-s', '--cmdopt=98k'])
pytest命令行参数方式执行命令:
pytest -s --cmdopt=因为我是中国人,所以我爱中国
运行结果:
② pytestconfig.addini 动态添加pytest.ini配置文件中的参数
1、在添加自定义参数到pytest配置对象中:在conftest.py文件中通过钩子函数 pytest_addoption
中使用 addoption
方法来添加自定义命令行参数。
2、在conftest.py文件中通过钩子函数 pytest_addoption
中使用 addini
方法来添加pytest.ini配置文件中的参数。
addini 方法源代码:
参数:
- name:添加到pytest.ini配置文件中的参数名;
- help:对参数名的帮助说明,方便查阅;
- type:参数类型,默认None,可以设置:None, "pathlist", "args", "linelist", "bool";
- default:参数默认值;
def addini(self, name, help, type=None, default=None):
""" register an ini-file option.
:name: name of the ini-variable
:type: type of the variable, can be ``pathlist``, ``args``, ``linelist``
or ``bool``.
:default: default value if no ini-file option exists but is queried.
The value of ini-variables can be retrieved via a call to
:py:func:`config.getini(name) <_pytest.config.Config.getini>`.
"""
assert type in (None, "pathlist", "args", "linelist", "bool")
self._inidict[name] = (help, type, default)
self._ininames.append(name)
实例:
contest.py
import pytest
def pytest_addoption(parser):
# 添加配置参数
parser.addini(
"base_url",
type=None,
default="http://www.lwjnicole.com",
help="添加base_url配置参数"
)
@pytest.fixture()
def base_url(pytestconfig):
return pytestconfig.getini("base_url")
test_a.py:
def test_base_url(base_url):
print("当前获取到的base_url = {}".format(base_url))
pytest命令行参数方式执行:
pytest -s
运行结果:
③ pytestconfig.getini()
获取pytest.ini配置文件中的配置参数
pytest.ini
test_a.py
import pytest
def test_get_ini(pytestconfig):
log_cli = pytestconfig.getini("log_cli")
print("\n获取到的log_cli = {}".format(log_cli))
xfail_strict = pytestconfig.getini("xfail_strict")
print("\n获取到的xfail_strict = {}".format(xfail_strict))
addopts = pytestconfig.getini("addopts")
print("\n获取到的addopts = {}".format(addopts))
if __name__ == '__main__':
pytest.main(['-s', 'test_option.py'])
pytest命令行方式执行命令:
pytest -s
运行结果: