← Назад к вопросам

Как пропустить тест в PyTest?

1.8 Middle🔥 191 комментариев
#Теория тестирования#Фреймворки тестирования

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пропуск тестов в PyTest: методы и практическое применение

В процессе тестирования часто возникают ситуации, когда определенные тесты необходимо временно или условно отключить. PyTest предлагает несколько элегантных механизмов пропуска тестов, которые значительно удобнее, чем комментирование кода. Эти подходы позволяют четко документировать причины пропуска и обеспечивают гибкость управления выполнением тестов.

Основные декораторы для пропуска тестов

PyTest предоставляет три основных декоратора для управления выполнением тестов:

1. @pytest.mark.skip - безусловный пропуск

import pytest

@pytest.mark.skip(reason="Тест устарел, требуется рефакторинг")
def test_legacy_functionality():
    """Этот тест никогда не выполняется"""
    assert 1 == 2  # Этот код не выполнится

2. @pytest.mark.skipif - условный пропуск

import sys
import pytest

@pytest.mark.skipif(
    sys.version_info < (3, 8),
    reason="Требуется Python 3.8 или выше"
)
def test_feature_requiring_python38():
    """Тест выполняется только на Python 3.8+"""
    import walrus  # Оператор := доступен с Python 3.8
    assert True

3. @pytest.mark.xfail - ожидаемый провал

import pytest

@pytest.mark.xfail(
    reason="Известный баг в API, исправят в следующем релизе",
    strict=True  # Будет FAIL, если тест неожиданно пройдет
)
def test_broken_api_integration():
    """Тест проверяет функциональность с известной ошибкой"""
    result = call_buggy_api()
    assert result.status == "success"  # Сейчас возвращает "error"

Практические примеры использования

Пропуск тестов на определенных платформах

import pytest
import platform

@pytest.mark.skipif(
    platform.system() != "Windows",
    reason="Тест специфичен для Windows API"
)
def test_windows_registry_access():
    """Тест выполняется только на Windows"""
    # Код работы с реестром Windows
    pass

Условный пропуск на основе зависимостей

import pytest

try:
    import pandas
    HAS_PANDAS = True
except ImportError:
    HAS_PANDAS = False

@pytest.mark.skipif(
    not HAS_PANDAS,
    reason="Требуется установленный pandas"
)
def test_dataframe_operations():
    """Тест требует наличия библиотеки pandas"""
    import pandas as pd
    df = pd.DataFrame({"A": [1, 2, 3]})
    assert len(df) == 3

Пропуск всего класса или модуля

Вы можете применять декораторы ко всему классу:

import pytest

@pytest.mark.skip(reason="Весь класс устарел")
class TestLegacyModule:
    """Все тесты в этом классе будут пропущены"""
    
    def test_method1(self):
        assert True  # Не выполнится
    
    def test_method2(self):
        assert False  # Не выполнится

Динамический пропуск в runtime

Иногда решение о пропуске теста нужно принимать во время выполнения:

import pytest

def test_conditionally_skipped():
    """Пример динамического пропуска"""
    config = load_test_config()
    
    if not config.get("feature_enabled"):
        pytest.skip("Фича отключена в конфигурации")
    
    # Основная логика теста
    result = perform_operation()
    assert result.is_successful()

Отличия между skip и xfail

Важно понимать семантическую разницу между этими подходами:

  • skip - тест не выполняется совсем (неизвестен результат)
  • xfail - тест выполняется, но ожидается его падение (known bug)

Просмотр пропущенных тестов в отчетах

При запуске PyTest с флагом -rs вы получаете детальную информацию о пропущенных тестах:

pytest -rs -v test_suite.py

В отчете будут указаны все пропущенные тесты с указанием причин, что удобно для:

  • Отслеживания временно отключенных тестов
  • Планирования работ по исправлению
  • Анализа покрытия функциональности

Best Practices

При использовании пропуска тестов рекомендуется:

  1. Всегда указывать причину пропуска в параметре reason
  2. Регулярно ревьюить пропущенные тесты на актуальность
  3. Использовать skipif вместо skip там, где это возможно
  4. Не злоупотреблять пропусками - это может маскировать реальные проблемы
  5. Вести учет пропущенных тестов в task-tracker системе

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