Ответ
Юнит-тестирование — это процесс проверки отдельных компонентов (модулей, функций, классов) программного кода в изоляции от остальной системы.
Преимущества
- Раннее обнаружение ошибок: Позволяет выявлять и исправлять баги на самых ранних стадиях разработки, что значительно дешевле, чем на этапе продакшена.
- Безопасный рефакторинг: Наличие тестов создает "сеть безопасности", которая гарантирует, что изменения в коде не нарушили существующую функциональность.
- Живая документация: Тесты служат примерами использования кода, демонстрируя, как должен работать тот или иной компонент.
- Улучшение архитектуры: Необходимость писать тестируемый код подталкивает разработчиков к созданию слабосвязанных (loosely coupled) и более продуманных компонентов.
Недостатки
- Увеличение времени разработки: Написание и поддержка качественных тестов требуют дополнительных временных затрат.
- Неполное покрытие: Юнит-тесты не могут обнаружить ошибки интеграции или системные проблемы, так как проверяют компоненты в изоляции.
- Ложное чувство безопасности: Высокий процент покрытия кода тестами не всегда означает отсутствие багов. Качество самих тестов имеет решающее значение.
- Сложность поддержки: При изменении логики приложения необходимо обновлять и соответствующие тесты, что может замедлить разработку, если тесты написаны хрупко (brittle).
Пример на Python с использованием pytest
:
# a_module.py
def calculate_discount(price: float, discount_percent: int) -> float:
if not 0 <= discount_percent <= 100:
raise ValueError("Discount must be between 0 and 100")
return price * (1 - discount_percent / 100)
# test_a_module.py
import pytest
from a_module import calculate_discount
def test_calculate_discount_positive():
"""Проверяет корректный расчет скидки."""
assert calculate_discount(100, 10) == 90.0
assert calculate_discount(200, 25) == 150.0
def test_calculate_discount_zero():
"""Проверяет нулевую скидку."""
assert calculate_discount(100, 0) == 100.0
def test_calculate_discount_invalid_percent():
"""Проверяет выброс исключения при некорректном проценте."""
with pytest.raises(ValueError):
calculate_discount(100, 101)