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

В каких случаях стоит использовать фейки в модульном тестировании?

2.2 Middle🔥 151 комментариев
#Тестирование

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI5 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Когда использовать фейки в модульном тестировании

В модульном тестировании фейки (fakes) — это упрощённые реализации зависимостей, которые используются для изоляции тестируемого модуля. Их применение особенно важно в архитектуре с зависимостями, где тестируемый код взаимодействует с внешними системами, сложными службами или компонентами с недетерминированным поведением.

Основные сценарии использования фейков

1. Изоляция тестируемого модуля от внешних зависимостей

Фейки заменяют реальные базы данных, API-клиенты, файловые системы или сторонние сервисы. Это позволяет:

  • Выполнять тесты без доступа к реальной инфраструктуре.
  • Контролировать поведение зависимостей (например, эмулировать успешный ответ API или ошибку сети).
  • Избегать побочных эффектов (например, реальных записей в БД или отправки email).
// Пример фейка для репозитория вместо реальной БД
class FakeUserRepository implements UserRepositoryInterface 
{
    private array $users = [];
    
    public function findById(int $id): ?User 
    {
        return $this->users[$id] ?? null;
    }
    
    public function addTestUser(User $user): void 
    {
        $this->users[$user->getId()] = $user;
    }
}

2. Ускорение выполнения тестов

Реальные зависимости (особенно внешние сервисы) часто работают медленно. Фейки выполняются в памяти, что значительно сокращает время тестирования. Например:

  • Фейк кеша вместо Redis/Memcached.
  • Фейк HTTP-клиента вместо реальных сетевых запросов.
  • Фейк очереди сообщений.

3. Тестирование граничных случаев и ошибок

С фейками можно легко симулировать редкие или проблемные сценарии:

  • Сбои сети или таймауты.
  • Нестандартные ответы внешних API.
  • Исключительные ситуации в зависимостях.
// Фейк, имитирующий сбой внешнего сервиса
class FailingPaymentGateway implements PaymentGatewayInterface 
{
    public function charge(float $amount): TransactionResult 
    {
        throw new PaymentGatewayException('Service unavailable');
    }
}

4. Детерминированное поведение в тестах

Фейки обеспечивают предсказуемость, исключая случайные факторы:

  • Нестабильные внешние сервисы.
  • Конкурентный доступ к общим ресурсам.
  • Изменяющиеся данные в реальных базах.

5. Упрощение настройки тестового окружения

Фейки не требуют сложной конфигурации или развёртывания инфраструктуры:

  • Не нужны Docker-контейнеры с БД.
  • Не требуются тестовые аккаунты в сторонних сервисах.
  • Легко создавать специфичные состояния для каждого теста.

Когда НЕ стоит использовать фейки

  1. Интеграционное тестирование — здесь нужны реальные компоненты для проверки их взаимодействия.
  2. Тестирование самой реализации зависимости — фейк не проверит корректность реального кода.
  3. Сложные бизнес-сценарии, где поведение фейка может отличаться от реальной системы (риск ложноположительных тестов).

Типы фейков и их различия

  • Стабы (Stubs) — предоставляют предопределённые ответы на вызовы.
  • Моки (Mocks) — проверяют, как тестируемый код взаимодействует с зависимостью.
  • Фейки (Fakes) — рабочие, но упрощённые реализации (как in-memory база данных).

Практические рекомендации для PHP

  1. Используйте интерфейсы для зависимостей, чтобы легко подменять реализации:
interface NotificationServiceInterface {
    public function send(User $user, string $message): bool;
}

class FakeNotificationService implements NotificationServiceInterface {
    public array $sentMessages = [];
    
    public function send(User $user, string $message): bool {
        $this->sentMessages[] = ['user' => $user->id, 'message' => $message];
        return true;
    }
}
  1. Внедряйте зависимости через конструктор для простой подмены в тестах.

  2. Используйте контейнер внедрения зависимостей для конфигурации фейков в тестовом окружении.

Фейки становятся критически важным инструментом при разработке через тестирование (TDD), позволяя писать модульные тесты до реализации реальных зависимостей. Они обеспечивают быстрые, стабильные и изолированные тесты, что напрямую влияет на качество кода и скорость разработки.

В каких случаях стоит использовать фейки в модульном тестировании? | PrepBro