Як відключити тест за допомогою 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():
    ...

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

Наприклад, якщо я хочу перевірити, чи встановлено у когось бібліотечні панди для тесту.

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
прийшов за допомогою пітесту, залишився для довідки
Uzebeckatrente

на що це посилання. Я повинен знати
XChikuX


Боюсь, це було задовго до мого часу. Але я радий, що зараз це знаю.
XChikuX

6

Ви також можете запустити тест, навіть якщо ви підозрюєте, що тест не вдасться. Для такого сценарію https://docs.pytest.org/en/latest/skipping.html пропонує використовувати decorator @ 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маркера, щоб вказати, що ви очікуєте тестування.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.