# В чем смысл юнит-тестов?

Смысл юнит-тестов в том, чтобы проверять **минимальные изолированные единицы кода** (обычно функции или методы класса) на корректность работы.

Основные цели:

1. **Ранняя проверка качества**\
   Ошибки ловятся сразу на этапе разработки, ещё до интеграции и сборки продукта.
2. **Документация поведения кода**\
   Юнит-тесты сами по себе описывают, как должна работать функция — это своего рода «живой пример использования».
3. **Поддержка рефакторинга**\
   Если код переписывается, тесты быстро покажут, что где-то нарушена логика. Это позволяет безопаснее вносить изменения.
4. **Локализация ошибок**\
   Так как юнит-тесты проверяют отдельные части кода изолированно (обычно с помощью mock-объектов), легче понять, где именно ошибка.
5. **Рост доверия к системе**\
   Когда большая часть бизнес-логики покрыта юнит-тестами, снижается вероятность, что «упадёт» что-то критичное при изменениях.
6. **Скорость обратной связи**\
   Юнит-тесты выполняются быстро (секунды), в отличие от UI-тестов.

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

```python
# bank.py
def calculate_interest(amount, rate, years):
    if amount < 0 or rate < 0 or years < 0:
        raise ValueError("Параметры должны быть неотрицательными")
    return amount * (1 + rate / 100) ** years
```

Тесты на **pytest**:

```python
# test_bank.py
import pytest
from bank import calculate_interest

def test_simple_case():
    assert calculate_interest(1000, 10, 1) == 1100

def test_multiple_years():
    assert calculate_interest(1000, 10, 2) == pytest.approx(1210, rel=1e-3)

def test_zero_rate():
    assert calculate_interest(1000, 0, 5) == 1000

def test_invalid_input():
    with pytest.raises(ValueError):
        calculate_interest(-1000, 10, 1)
```

Запуск тестов:

```bash
pytest -v
```

Хочешь, я ещё покажу, как параметризовать тесты в `pytest`, чтобы не дублировать однотипные проверки?

Что проверяют тесты:

* корректность результата при разных входных данных,
* работу при нулевой ставке,
* обработку некорректных входных значений.
