【pytest】內置 fixtures 之 pytestconfig:使用 pytestconfig 獲取命令行參數 和 pytest.ini 配置文件的值

內置 fixtures:

前面說過我們可以通過自定義 fixture 來實現測試用例的前置和後置工作,其實 pytest 中也有一些內置的 fixture 可供我們調用;

內置 fixture 的作用就是爲了使 pytest 更加強大,它可以修改控制 pytest 的行爲,以及爲我們提供一些更加便利的功能。

pytestconfig:

pytestconfig 可以通過命令行參數、選項、配置文件、插件、運行目錄等方式來控制pytest;

pytestconfig 實際上就是 request.config 的快捷方式,被稱爲“pytest 配置對象”;

源碼展示:

# fixtures.py

@fixture(scope="session")
def pytestconfig(request):
    """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 是 FixtureRequest 的實例對象,FixtureRequest 在官方的描述中是這樣的:

FixtureRequest 是來自 fixture 或者 測試用例的請求,它有訪問測試上下文的權限;

request.config 則是 FixtureRequest 中的屬性:

class FixtureRequest:
    """ A request for a fixture from a test or fixture function.

    A request object gives access to the requesting test context
    and has an optional ``param`` attribute in case
    the fixture is parametrized indirectly.
    """
    ...

    @property
    def config(self):
        """ the pytest config object associated with this request. """
        return self._pyfuncitem.config

request.config 返回的是 `_pytest.config.Config` (pytest 配置對象):

它可以訪問配置值、插件管理器和插件掛鉤;

然後 Config 中提供的方法中,我們最長使用的就是 getoption() 和getini():

getoption() 可以獲取命令行的值;

getini() 可以獲取 pytest.ini 配置文件的參數值;

使用 pytestconfig 獲取命令行參數的值:

方法參數:

def getoption(self, name: str, default=notset, skip: bool = False):
    """ return command line option value.
    """
    ...

pytestconfig 這個內置 fixture 是實際使用中最多的,用來獲取命令行參數,尤其是一些必須由外部傳遞給 pytest 的一些自定義參數,下面是項目中的實例,目的是將設備信息傳遞給 pytest:

# conftest.py

import pytest

# 註冊自定義參數 cmdopt 到配置對象
def pytest_addoption(parser):
    parser.addoption("--cmdopt", action="store",
                     default="None",
                     help="將自定義命令行參數 ’--cmdopt' 添加到 pytest 配置中")

# 從配置對象獲取 cmdopt 的值
@pytest.fixture(scope='session')
def cmdopt(pytestconfig):
    return pytestconfig.getoption('--cmdopt')

# 然後任何 fixture 或測試用例都可以調用 cmdopt 來獲得設備信息
# main.py

device_info = {'id': 'xxx', 'name': '華爲', 'version': '10'}

pytest.main(['-m all',
             f'--cmdopt={device_info}'])  # 使用自定義參數傳參

使用 pytestconfig 獲取 pytest.ini 配置文件中參數的值:

# pytest.ini

[pytest]
markers =
    demo : marks tests as demo
    smoke: marks tests as smoke
    test : marks tests as test

log_cli = 1
# conftest.py

@pytest.fixture(autouse=True)
def fuc_fix(pytestconfig):
    print()
    print(pytestconfig.getini('markers'))
    print(pytestconfig.getini('log_cli'))
# 控制檯輸出結果:
============================= test session starts =============================
test_Z.py::TestDemoA::test_A_001 
['demo : marks tests as demo', 'smoke: marks tests as smoke', 'test : marks tests as test']
True
PASSED
============================== 1 passed in 0.02s ==============================

 注意:部分參數中的值會被轉換爲布爾值!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章