Как отключить проверку с помощью py.test?
Скажем, у меня есть куча тестов:
def test_func_one():
...
def test_func_two():
...
def test_func_three():
...
Есть ли декоратор или что-то подобное, что я мог бы добавить к функциям, чтобы предотвратить запуск py.test именно этого теста? Результат может выглядеть примерно так...
@pytest.disable()
def test_func_one():
...
def test_func_two():
...
def test_func_three():
...
Я искал что-то подобное в документах py.test, но я думаю, что я мог бы здесь что-то упустить.
Ответы
Ответ 1
В Pytest есть декораторы пропуска и пропуска, аналогичные модулю модульного теста Python (который использует skip
и skipIf
), который можно найти в документации здесь.
Примеры по ссылке можно найти здесь:
@pytest.mark.skip(reason="no way of currently testing this")
def test_the_unknown():
...
import sys
@pytest.mark.skipif(sys.version_info < (3,3),
reason="requires python3.3")
def test_function():
...
Первый пример всегда пропускает тест, второй пример позволяет вам условно пропустить тесты (отлично, когда тесты зависят от платформы, исполняемой версии или дополнительных библиотек.
Например, если я хочу проверить, установлена ли у кого-то библиотека панд для теста.
import sys
try:
import pandas as pd
except ImportError:
pass
@pytest.mark.skipif('pandas' not in sys.modules,
reason="requires the Pandas library")
def test_pandas_function():
...
Ответ 2
skip
декоратор выполнит работу:
@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
# ...
(аргумент reason
необязателен, но всегда полезно указать, почему тест пропущен).
Существует также skipif()
который позволяет отключить тест, если выполнено определенное условие.
Эти декораторы могут применяться к методам, функциям или классам.
Чтобы пропустить все тесты в модуле, определите глобальную переменную pytestmark
:
# test_module.py
pytestmark = pytest.mark.skipif(...)
Ответ 3
Я не уверен, что он обесценился, но вы также можете использовать функцию pytest.skip
внутри теста:
def test_valid_counting_number():
number = random.randint(1,5)
if number == 5:
pytest.skip('Five is right out')
assert number <= 3
Ответ 4
Вы также можете запустить тест, даже если вы подозреваете, что тест завершится с ошибкой. Для такого сценария https://docs.pytest.org/en/latest/skipping.html предлагает использовать decorator @pytest.mark.xfail
@pytest.mark.xfail
def test_function():
...
В этом случае Pytest по-прежнему будет запускать ваш тест и позволить вам сейчас, если он пройдет или сейчас, но не будет жаловаться и нарушать сборку.