pytest内置fixture之pytestconfig

前言

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 ,运行结果为:

pytest内置fixture之pytestconfig

从结果中可以看到,两种方式都可以获取到命令行参数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  ,运行结果:

pytest内置fixture之pytestconfig

从结果中可以看到我们获取到了通过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'])

运行结果:

pytest内置fixture之pytestconfig

从运行结果中可以看到我们可以通过pytestconfig.getini()方法来获取配置文件中的配置参数。

上一篇:pytest之命令行参数之--setup-show查看fixture的执行过程


下一篇:Pytest--fixture详解