Как отключить проверку с помощью 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 по-прежнему будет запускать ваш тест и позволить вам сейчас, если он пройдет или сейчас, но не будет жаловаться и нарушать сборку.