pytest内置fixture函数之pytestconfig详解(参照pytest内置fixture函数之request)
前言
pytestconfig 是pytest框架的一个内置fixture函数,可以获取上下文,它的作用跟 request.config 是一样的,代表pytest配置对象。
参照博客:pytest之内置fixture函数之request详解(request.params && request.config && request.module && 。。。)
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框架中自带的命令行参数值,也可以获取用户注册的自定义参数值】
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
运行结果:
去期待陌生,去拥抱惊喜。