Каков алгоритм написания тестов для функции в Python?

Ответ

Процесс написания тестов для функции строится вокруг стандартного паттерна Arrange-Act-Assert (AAA) или Given-When-Then.

Общий алгоритм:

  1. Определение сценариев: Проанализировать функцию и определить, что нужно протестировать.

    • Позитивные сценарии: Работа с корректными, ожидаемыми данными.
    • Негативные сценарии: Реакция на некорректные данные (неверный тип, формат).
    • Граничные случаи: Проверка на крайних значениях (пустые строки, 0, None, максимальные значения).
  2. Написание теста для каждого сценария по структуре AAA:

    • Arrange (Подготовка): Создать все необходимые условия и входные данные для теста. Инициализировать объекты, подготовить моки (mocks).
    • Act (Действие): Вызвать тестируемую функцию с подготовленными данными.
    • Assert (Проверка): Сравнить полученный результат с ожидаемым. Убедиться, что состояние системы изменилось так, как предполагалось, или что было вызвано нужное исключение.

Пример с pytest для функции add:

# Функция, которую мы тестируем
def add(a, b):
    if not isinstance(a, (int, float)) or not isinstance(b, (int, float)):
        raise TypeError("Оба аргумента должны быть числами")
    return a + b

# --- Тесты ---
import pytest

def test_add_positive_numbers():
    # Arrange (Подготовка)
    num1 = 5
    num2 = 10
    expected_result = 15

    # Act (Действие)
    actual_result = add(num1, num2)

    # Assert (Проверка)
    assert actual_result == expected_result

def test_add_negative_numbers():
    # AAA в одну строку для простых случаев
    assert add(-2, -3) == -5

def test_add_with_zero():
    assert add(10, 0) == 10

def test_add_raises_type_error_for_string():
    # Для проверки исключений используется контекстный менеджер
    with pytest.raises(TypeError):
        # Act & Assert происходят здесь
        add("2", 3)