Как отключить тест с помощью pytest?

86

Допустим, у меня есть куча тестов:

def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...

Есть ли декоратор или что-то подобное, что я мог бы добавить к функциям, чтобы предотвратить pytestзапуск только этого теста? Результат может выглядеть примерно так ...

@pytest.disable()
def test_func_one():
    ...

def test_func_two():
    ...

def test_func_three():
    ...
Эрикмил
источник

Ответы:

133

Pytest имеет декораторы skip и skipif, аналогичные модулю Python unittest (который использует 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():
    ...

Первый пример всегда пропускает тест, второй пример позволяет вам условно пропускать тесты (отлично, когда тесты зависят от платформы, исполняемой версии или дополнительных библиотек.

Например, если я хочу проверить, установлена ​​ли у кого-то библиотека pandas для тестирования.

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():
    ...
Александр Хушзаг
источник
Есть ли что-нибудь похожее на то, .skipчто есть в Mocha (Node.js)? it('tests something'...)-> it.skip('tests something'...)который отключил бы этот конкретный тест. У него также есть удобная противоположность: .onlyон запускает только этот тест и ничего больше.
Юха Унтинен
Я имею в виду, что со своей onlyстороны вы можете сделать это через командную строку или что-то еще, что вы используете для инициализации средства запуска тестов: stackoverflow.com/a/36539692/4131059 Что касается itи it.skip, я считаю, что функциональность здесь полностью покрывает это.
Александр Хусзаг
21

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(...)
алексе
источник
10

Я не уверен, устарел ли он, но вы также можете использовать эту pytest.skipфункцию внутри теста:

def test_valid_counting_number():
     number = random.randint(1,5)
     if number == 5:
         pytest.skip('Five is right out')
     assert number <= 3
Уэйн Вернер
источник
2
пришел за помощью pytest, остался для справки
Uzebeckatrente
на что это ссылается. Я должен знать
XChikuX
@XChikuX youtube.com/watch?v=xOrgLj9lOwk
Уэйн Вернер
Боюсь, это было задолго до моего времени. Но я рад, что знаю это сейчас.
XChikuX
6

Вы также можете запустить тест, даже если подозреваете, что тест завершится неудачно. Для такого сценария https://docs.pytest.org/en/latest/skipping.html предлагает использовать декоратор @ pytest.mark.xfail.

@pytest.mark.xfail
def test_function():
    ...

В этом случае Pytest все равно будет запускать ваш тест и сообщать вам, прошел он или нет, но не будет жаловаться и нарушать сборку.

Рубен Гаспарян
источник
2

Если вы хотите пропустить тест, но не жестко запрограммировать маркер, лучше используйте выражение ключевого слова, чтобы избежать его.

pytest test/test_script.py -k 'not test_func_one'
Ариндам Ройчоудхури
источник
1

Вы можете отметить тест с skipи skipifдекораторами , когда вы хотите , чтобы пропустить тест в pytest.

Пропуск теста

@pytest.mark.skip(reason="no way of currently testing this")
def test_func_one():
    ...

Самый простой способ пропустить тест - это пометить его skipдекоратором, который можно передать как необязательный reason.

Также можно принудительно пропустить во время выполнения или настройки теста, вызвав pytest.skip(reason)функцию. Это полезно, когда невозможно оценить условие пропуска во время импорта.

def test_func_one():
    if not valid_config():
        pytest.skip("unsupported configuration")

Пропуск теста по условию

@pytest.mark.skipif(sys.version_info < (3, 6), reason="requires python3.6 or higher")
def test_func_one():
    ...

Если вы хотите пропустить на основе условного выражения, вы можете использовать skipifвместо этого. В предыдущем примере тестовая функция пропускается при запуске в интерпретаторе более ранней версии, чем Python3.6.

Наконец, если вы хотите пропустить тест, потому что уверены, что он не работает, вы также можете рассмотреть возможность использования xfailмаркера, чтобы указать, что вы ожидаете, что тест завершится неудачно.

lmiguelvargasf
источник