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框架中自带的命令行参数值,也可以获取用户注册的自定义参数值】

参考博客:pytest动态添加自定义命令行参数并通过request.config内置fixture函数获取该参数对应的参数值到程序中(pytest_addoption钩子函数添加指定参数对应的参数值到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

运行结果:

 

posted @ 2021-07-26 12:27  习久性成  阅读(931)  评论(0编辑  收藏  举报