← Назад к вопросам

Что такое 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% кода
Что такое Unit в термине Unit тест? | PrepBro