← Назад к вопросам
Что такое Unit в термине Unit тест?
1.0 Junior🔥 161 комментариев
#DevOps и инфраструктура#Django
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Unit в Unit тестах
Unit (единица) в тестировании — это наименьший тестируемый компонент кода. Это может быть функция, метод класса, или целый класс в зависимости от размера и сложности.
Что такое Unit?
Unit Test проверяет один конкретный функционал в изоляции:
- Единственная функция
- Один метод класса
- Изолированный от остального кода (без зависимостей)
- С известными входными данными (input)
- С проверкой ожидаемого результата (output)
Критерии Unit тестов
# ✅ Хороший Unit тест — тестирует ОДНО
def test_calculate_discount():
"""Тестируем только функцию расчёта скидки"""
assert calculate_discount(100, 0.1) == 90
assert calculate_discount(50, 0.5) == 25
# ❌ Плохой Unit тест — тестирует ВСЁ подряд
def test_entire_order_system():
"""Это не unit тест, это integration тест"""
user = create_user() # БД
product = create_product() # БД
order = place_order(user, product) # БД
payment = process_payment(order) # Платёжная система
assert order.status == "completed"
Примеры Unit тестов на Python (pytest)
# Модуль для тестирования
class Calculator:
def add(self, a: int, b: int) -> int:
"""Сложение двух чисел"""
return a + b
def divide(self, a: int, b: int) -> float:
"""Деление с проверкой на ноль"""
if b == 0:
raise ValueError("Деление на ноль")
return a / b
# Unit тесты
import pytest
class TestCalculator:
def setup_method(self):
"""Подготовка перед каждым тестом"""
self.calc = Calculator()
def test_add_positive_numbers(self):
"""Unit: тест сложения положительных чисел"""
result = self.calc.add(5, 3)
assert result == 8
def test_add_negative_numbers(self):
"""Unit: тест сложения отрицательных чисел"""
result = self.calc.add(-5, -3)
assert result == -8
def test_divide_normal_case(self):
"""Unit: тест деления (нормальный случай)"""
result = self.calc.divide(10, 2)
assert result == 5.0
def test_divide_by_zero_raises_error(self):
"""Unit: тест деления на ноль"""
with pytest.raises(ValueError, match="Деление на ноль"):
self.calc.divide(10, 0)
Unit тест с mocking (изоляция зависимостей)
from unittest.mock import Mock, patch
class UserService:
def __init__(self, db):
self.db = db
def get_user(self, user_id: int):
"""Получить пользователя из БД"""
return self.db.query(f"SELECT * FROM users WHERE id = {user_id}")
def promote_user(self, user_id: int):
"""Повысить роль пользователя"""
user = self.get_user(user_id)
user.role = "admin"
self.db.save(user)
return user
# Unit тест БЕЗ реальной БД (с mocking)
def test_promote_user():
"""Unit: тест повышения пользователя"""
# Создаём mock БД
mock_db = Mock()
mock_user = {"id": 1, "name": "Alice", "role": "user"}
mock_db.query.return_value = mock_user
# Создаём сервис с mock БД
service = UserService(mock_db)
# Тестируем метод (в изоляции)
result = service.promote_user(1)
# Проверяем результат
assert result["role"] == "admin"
assert mock_db.save.called # Проверяем что save был вызван
Пирамида тестирования
/\ E2E тесты (5%)
/ \ Долгие, нестабильные, дорогие
/ \
/------\ Integration тесты (15%)
/ \ Несколько компонентов вместе
/ \
/____________\ Unit тесты (80%)
Быстрые, дешевые, много
Свойства хорошего Unit теста (FAST)
- Fast — выполняется быстро (миллисекунды)
- Autonomous — независим от других тестов
- Self-checking — сам определяет pass/fail
- Timely — пишется вместе с кодом (TDD)
Ключевые моменты
- Unit = наименьшая функциональная единица
- Изоляция — использование mocks для зависимостей
- Один тест = один сценарий (не проверяем всё сразу)
- Быстрое выполнение — тесты должны работать мгновенно
- Понятные имена — из названия ясна цель теста
- Не используем БД, API, файлы — мокируем всё
- Высокое покрытие — 80-90% кода