前言
pytestconfig是pytest的一个内置fixture,可以获取上下文,它的作用跟 request.config 是一样的,可以获取配置对象。
pytestconfig的源代码
@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
从源代码中可以看到,实际上返回的就是request.config,所以说pytestconfig的作用与request.config的作用是一样的。
源码中还提供了使用示例:
def test_foo(pytestconfig): if pytestconfig.getoption("verbose") > 0:
pytestconfig中有2个比较常用的方法:
- getoption:获取命令行中的参数;
- getini:获取pytest.ini配置文件中的参数;
getoption获取命令行参数:
# file_name: configtest.py def pytest_addoption(parser): parser.addoption( "--cmdopt", action="store", default="type1", help="my option: type1 or type2" ) @pytest.fixture() def cmdopt(pytestconfig): return pytestconfig.getoption("--cmdopt")
测试用例:
# file_name: test_option.py import pytest def test_cmd_1(cmdopt): # 通过conftest中定义的fixture来获取参数值 print("test_cmd_1当前获取的参数为:{}".format(cmdopt)) def test_cmd_2(pytestconfig): # 直接通过pytestconfig获取参数值 cmdopt = pytestconfig.getoption("cmdopt") print("test_cmd_2当前获取的参数为:{}".format(cmdopt)) if __name__ == '__main__': pytest.main(['-s', 'test_option.py'])
命令行中执行指令: pytest test_option.py -s --cmdopt=type2 ,运行结果为:
从结果中可以看到,两种方式都可以获取到命令行参数cmdopt的值。
pytestconfig动态添加pytest.ini配置参数(addini)
我们之前在conftest.py文件中通过在钩子函数pytest_addoption中使用addoption方法来添加命令行参数,现在我们在钩子函数pytest_addoption中使用addini来添加配置参数:
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)
上面是addini的源码,从源码中可以看到addini方法有4个参数:name,help,type,default
- name:是参数的名称;
- help:是帮助说明,方便查阅;
- type:是参数类型,默认None,可以设置:None, "pathlist", "args", "linelist", "bool";
- default:参数默认值;
举例:
# file_name: configtest.py def pytest_addoption(parser): # 添加命令行参数 parser.addoption( "--cmdopt", action="store", default="type1", help="my option: type1 or type2" ) # 添加配置参数 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")
测试用例:
# file_name: test_option.py import pytest def test_base_url(base_url): print("当前获取到的base_url = {}".format(base_url)) if __name__ == '__main__': pytest.main(['-s', 'test_option.py'])
命令行输入指令: pytest test_option.py -s ,运行结果:
从结果中可以看到我们获取到了通过addini()添加的配置参数base_url。
pytestconfig获取配置文件中的配置参数(getini)
现在有配置文件pytest.ini的内容如下:
# file_name: pytest.ini [pytest] markers = slow: run slow mark case fast: run fast mark case xfail_strict = True addopts = -v --reruns=2 --html=report.html --self-contained-html log_cli = False norecursedirs = venv report util log python_files = test*.py python_classes = Test* python_functions = test_*
测试用例:
# file_name: test_option.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'])
运行结果:
从运行结果中可以看到我们可以通过pytestconfig.getini()方法来获取配置文件中的配置参数。