Как сделать аргументы командной строки доступными в декораторах, использующих pytest? - PullRequest
0 голосов
/ 07 апреля 2019

Context

Я пытаюсь добиться декоратора, который, в зависимости от аргумента командной строки, изменит способ запуска теста:

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

Вызов этого декоратораas:

@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_, но не для произвольных функций в тестовом модуле.

Вопрос

Как я могу получить аргументы командной строки из pytest, если не через test_ аргументы / фиксаторы функций?

1 Ответ

0 голосов
/ 08 апреля 2019

Короткий ответ

Используя 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...