Как я могу гарантировать, что тесты с маркером запускаются только в том случае, если это явно запрошено в pytest?

У меня есть несколько тестов, которые я пометил соответствующим маркером. Если я запускаю pytest, они запускаются по умолчанию, но я бы хотел пропустить их по умолчанию. Единственный известный мне вариант — явно сказать «не маркер» при вызове pytest, но я бы хотел, чтобы они не запускались по умолчанию, если маркер явно не запрашивается в командной строке.

Кажется, что пример в Контролировать пропуск тестов в соответствии с параметром командной строки соответствует вашему варианту использования.

hoefling 30.05.2019 13:56

@hoefling нет. Я не хочу добавлять параметры командной строки. Я хочу запустить pytest без каких-либо параметров командной строки и получить все тесты Кроме, отмеченные, но если я запускаю с -k "marker", я хочу, чтобы они (и только они) выполнялись

Stefano Borini 30.05.2019 14:14

Конечно, это не пример копирования и вставки, вам нужно удалить пользовательский аргумент и заменить одну строку, читающую аргумент; см. адаптированный пример в моем ответе.

hoefling 30.05.2019 16:07

@hoefling идеально. Мне не хватало знания config.option.keyword. Спасибо.

Stefano Borini 31.05.2019 10:22
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
4
4
1 302
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Небольшая модификация примера в Контролировать пропуск тестов в соответствии с параметром командной строки:

# conftest.py

import pytest


def pytest_collection_modifyitems(config, items):
    keywordexpr = config.option.keyword
    markexpr = config.option.markexpr
    if keywordexpr or markexpr:
        return  # let pytest handle this

    skip_mymarker = pytest.mark.skip(reason='mymarker not selected')
    for item in items:
        if 'mymarker' in item.keywords:
            item.add_marker(skip_mymarker)

Примеры тестов:

import pytest


def test_not_marked():
    pass


@pytest.mark.mymarker
def test_marked():
    pass

Запуск тестов с маркером:

$ pytest -v -k mymarker
...
collected 2 items / 1 deselected / 1 selected
test_spam.py::test_marked PASSED
...

Или:

$ pytest -v -m mymarker
...
collected 2 items / 1 deselected / 1 selected
test_spam.py::test_marked PASSED
...

Без маркера:

$ pytest -v
...
collected 2 items

test_spam.py::test_not_marked PASSED
test_spam.py::test_marked SKIPPED
...

Вместо того, чтобы явно говорить «не маркер» при вызове pytest, вы можете добавить следующее в pytest.ini

[pytest]
addopts = -m "not marker"

Другие вопросы по теме