Работал ли с декораторами в Python?

«Работал ли с декораторами в Python?» — вопрос из категории Python, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, работал. В контексте автоматизации тестирования на Python я использовал декораторы для решения нескольких задач.

Основные сценарии применения:

  1. Параметризация тестов в pytest: Декоратор @pytest.mark.parametrize — это основной инструмент для запуска одного теста с разными наборами входных данных и ожидаемых результатов.

    import pytest
    
    @pytest.mark.parametrize("input, expected", [
        ("admin", 200),
        ("user", 200),
        ("", 401),
        ("invalid", 403)
    ])
    def test_login_status_code(input, expected):
        # Код теста, использующий input
        status = login(username=input)
        assert status == expected
  2. Маркировка тестов: Декораторы @pytest.mark.smoke, @pytest.mark.regression, @pytest.mark.skip или @pytest.mark.xfail для категоризации и управления выполнением тестовых наборов.

    @pytest.mark.smoke
    @pytest.mark.api
    def test_api_health_check():
        response = requests.get(API_URL + "/health")
        assert response.status_code == 200
  3. Кастомные декораторы для логирования и обработки исключений: Например, декоратор для логирования начала и окончания выполнения каждого теста или для перехвата и логирования определенных исключений без прерывания падения теста.

    def log_test_execution(func):
        def wrapper(*args, **kwargs):
            test_name = func.__name__
            logger.info(f"Starting test: {test_name}")
            result = func(*args, **kwargs)
            logger.info(f"Finished test: {test_name}")
            return result
        return wrapper
    
    @log_test_execution
    def test_complex_workflow():
        # ... код теста

Декораторы позволяют сохранять тестовый код чистым и сфокусированным на бизнес-логике, вынося вспомогательную функциональность (логирование, повторные попытки, setup/teardown) в отдельные, переиспользуемые компоненты.