Какие виды исключений вы знаете в контексте тестирования Python-приложений?

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

Ответ

При написании автотестов на Python (с использованием pytest или unittest) важно знать иерархию исключений, чтобы корректно их отлавливать и проверять.

Основные встроенные исключения, релевантные для тестирования:

  • AssertionError: Базовое исключение для падения утверждения (assert). pytest преобразует его в информативное сообщение о неудачном тесте.
  • LookupError и его наследники:
    • IndexError — обращение к несуществующему индексу списка. Проверяем в тестах граничные условия.
    • KeyError — обращение к несуществующему ключу словаря. Тестируем методы dict.get() или обработку отсутствующих ключей.
  • TypeError: Передача аргумента не того типа. В тестах проверяем валидацию входных данных функции.
  • ValueError: Аргумент правильного типа, но некорректного значения (например, int('abc')).
  • OSError и его наследники (IOError, FileNotFoundError): Ошибки работы с файловой системой. Тестируем сценарии "файл не найден", "нет прав на запись".
  • AttributeError: Обращение к несуществующему атрибуту объекта.

Пример теста с проверкой исключения в pytest:

import pytest

def test_divide_by_zero():
    """Проверяем, что деление на ноль вызывает ZeroDivisionError."""
    with pytest.raises(ZeroDivisionError) as exc_info:
        result = 1 / 0
    # Можно дополнительно проверить текст исключения
    assert str(exc_info.value) == 'division by zero'

# Пример теста для проверки валидации входа
def test_validate_age_negative():
    """Проверяем, что отрицательный возраст вызывает ValueError."""
    from app.validator import validate_age
    with pytest.raises(ValueError, match="Age cannot be negative"):
        validate_age(-5)

В автотестах мы используем pytest.raises() (или assertRaises в unittest) для явной проверки, что код в определенной ситуации бросает ожидаемое исключение. Это ключевая практика тестирования негативных сценариев.