如何使用pytest使命令行参数在装饰器中可用?

时间:2019-04-07 18:17:31

标签: python pytest

上下文

我想要实现的是拥有一个装饰器,该装饰器将根据命令行参数来更改测试的运行方式:

import pytest
from functools import wraps


def magic():

    # obtain extra_bit
    extra_bit = ...

    def wrapper(f):
        if extra_bit:
            @wraps(f)
            def test_func(*args, **kwars):
                f(*args, **kwars)
        else:
            @wraps(f)
            def test_func(*args, **kwargs):
                assert 0

        return test_func

    return wrapper

将此装饰器称为:

@magic(4)
def test_this():
    assert 0

调用界面很重要,因为命令行参数不应出现在此处(因为装饰器的用户从不对其进行任何操作)。

从pytest文档改写为

https://docs.pytest.org/en/latest/example/simple.html

使命令行参数可以作为固定装置来测试pytest中的功能非常容易:

import pytest

def pytest_addoption(parser):
    parser.addoption('--extra_bit', action='store_true')

@pytest.fixture
def extra_bit(request):
    return request.config.getoption('--extra_bit')

然后在测试中使用它们

def test_this(extra_bit):
    assert extra_bit

但是,这些固定装置仅在用于test_函数的定义中时才起作用,而不适用于测试模块中的任意函数。

问题

如果不通过test_函数自变量/固定装置,如何从pytest获取命令行自变量?

1 个答案:

答案 0 :(得分:0)

简而言之

使用pytest_configure可以使该选项在conftest.py文件中可用。

conftest.py

import pytest

_EXTRA_BIT = False

def extra_bit():
    return _EXTRA_BIT

def pytest_addoption(parser):
    parser.addoption("--extra_bit", action="store_true")

def pytest_configure(config):
    global _EXTRA_BIT
    _EXTRA_BIT = config.getoption("--extra_bit")

testplugin.py

from conftest import extra_bit
from functools import wraps


def magic():

    # obtain extra_bit
    extra_bit = extra_bit()

    def wrapper(f):
        if extra_bit:
            @wraps(f)
            def test_func(*args, **kwars):
                f(*args, **kwars)
        else:
            @wraps(f)
            def test_func(*args, **kwargs):
                assert 0

        return test_func

    return wrapper

编辑:下面的旧答案使用了不推荐使用pytest.config模块。

简而言之

因此,事实证明pytest确实通过pytest.config模块提供了该功能。有关此文档,请参见:https://docs.pytest.org/en/latest/reference.html#_pytest.config.Config。一个可以使用的功能是getoption函数。

自适应示例

import pytest
from functools import wraps


def magic():

    # obtain extra_bit
    extra_bit = pytest.config.getoption('--extra_bit')

    def wrapper(f):
        if extra_bit:
            @wraps(f)
            def test_func(*args, **kwars):
                f(*args, **kwars)
        else:
            @wraps(f)
            def test_func(*args, **kwargs):
                assert 0

        return test_func

    return wrapper