Ответ
При написании автотестов на 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) для явной проверки, что код в определенной ситуации бросает ожидаемое исключение. Это ключевая практика тестирования негативных сценариев.