Что представляет собой ‘unit’ в юнит-тестировании?

Ответ

В контексте юнит-тестирования (unit testing), 'unit' (модуль) — это наименьшая логически обособленная и изолированная часть программного кода, которую можно протестировать.

Цель юнит-теста — проверить, что этот конкретный 'unit' работает корректно в изоляции от остальной системы. Внешние зависимости (например, обращения к базе данных, файловой системе или API) обычно заменяются заглушками (mocks, stubs).

В роли 'юнита' чаще всего выступают:

  • Функция или метод
  • Класс
  • Иногда — небольшой модуль

Пример:

Допустим, у нас есть функция-юнит для расчета скидки:

# a_unit_of_code.py
def calculate_discount(price, discount_percent):
    if not 0 <= discount_percent <= 100:
        raise ValueError("Скидка должна быть в диапазоне от 0 до 100")
    return price * (discount_percent / 100)

Юнит-тест для этой функции будет проверять её логику с разными входными данными:

# test_unit.py
import pytest
from a_unit_of_code import calculate_discount

def test_calculate_discount_positive():
    """Проверяет корректный расчет скидки."""
    assert calculate_discount(100, 10) == 10.0
    assert calculate_discount(200, 25) == 50.0

def test_calculate_discount_with_invalid_percent():
    """Проверяет вызов исключения при некорректном проценте."""
    with pytest.raises(ValueError):
        calculate_discount(100, 101)

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

  1. Изоляция: Тест не должен зависеть от внешних систем или других юнитов.
  2. Скорость: Юнит-тесты должны выполняться очень быстро, так как их запускают часто.
  3. Автоматизация: Запуск и проверка результатов должны быть полностью автоматическими.

Такой подход позволяет быстро находить и исправлять ошибки на ранних стадиях разработки.