Pytest: отмена выбора тестов

С pytest можно отмечать тесты с помощью декоратора

@pytest.mark.slow
def some_slow_test():
    pass

Затем из командной строки можно указать pytest пропустить тесты, помеченные как "медленные".

pytest -k-slow

Если у меня есть дополнительный тег:

@pytest.mark.long
def some_long_test()
    pass

Я бы хотел пропустить как длинные, так и медленные тесты. Я пробовал это:

pytest -k-slow -k-long

и это:

pytest -k-slow,long

И ни один из них не работает.

Как в командной строке указать pytest пропустить как медленные, так и длинные тесты?


person JS.    schedule 13.09.2011    source источник


Ответы (5)


Кроме того, с недавним добавлением параметра командной строки "-m" вы должны иметь возможность писать:

py.test -m "not (slow or long)"

IOW, опция «-m» принимает выражение, которое может использовать маркеры в качестве логических значений (если маркер не существует в тестовой функции, его значение равно False, если он существует, то True).

person hpk42    schedule 02.02.2012
comment
Здесь важно понять разницу между -m и -k. -m используется для фильтрации по маркерам, а -k используется для фильтрации по тестовым именам. - person Thomas Devoogdt; 01.05.2020

Просмотр кода pytest (mark.py) и дальнейшие эксперименты показывают, что, похоже, работает следующее:

pytest -k "-slow -long"

(Использование опции --collect-only ускоряет эксперименты)

person JS.    schedule 13.09.2011
comment
Возможно, API изменилось. Я попробовал pytest -k "-slow -long" и вернулся py.test: error: argument -k: expected one argument - person dmmfll; 09.11.2015

Также возможно штабелирование декораторов меток.

@pytest.mark.slow
@pytest.mark.main
def test_myfunction():
    pass

Затем я вызвал py.test -m "slow and main", и были вызваны только тесты с обоими декораторами.

py.test -m "not (slow and main)" привело к запуску других тестов

person dmmfll    schedule 08.11.2015

Если вы пытаетесь запустить тесты из файла python, то есть вы запускаете свои тесты, вызывая

$ python testfile.py

который имеет содержание

import pytest

pytest.main()

и вы хотите знать, как передать флаг CLI в pytest.main, ответ:

pytest.main(["-m", "not slow"])

PS - да, для того, чтобы так называть тесты, есть законные основания. Молитесь, чтобы вам никогда не приходилось их изучать.

person Sam H.    schedule 08.02.2020

Ваш тест написан правильно? Обычно тесты начинаются с test_? Но в любом случае это зависит от того, что вы пытаетесь фильтровать, вы можете фильтровать эти тесты по имени с помощью -k "not slow and not long" или по тегу с использованием -m "not slow and not long".

Запускать тесты по ключевым словам

-k: это запустит тесты, которые содержат имена, соответствующие заданному строковому выражению (без учета регистра), которые могут включать операторы Python, которые используют имена файлов, имена классов и имена функций в качестве переменных.

Запуск тестов по выражениям маркеров

-m: будут запускать все тесты, украшенные декоратором @pytest.mark.slow.

Дополнительную информацию о документации можно найти на:

person Thomas Devoogdt    schedule 01.05.2020