Как писать компонентные тесты?

«Как писать компонентные тесты?» — вопрос из категории Фреймворки тестирования, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

Мой подход:

  1. Изоляция зависимостей: Использую моки (mocks) и стабы (stubs) для всех внешних зависимостей (база данных, API, файловая система, другие модули). Например, в проекте на Java с JUnit и Mockito это выглядит так:

    @Test
    void calculateDiscount_ShouldApplyTenPercent() {
        // Arrange: Создаем мок зависимости и тестируемый объект
        CustomerRepository mockRepo = mock(CustomerRepository.class);
        when(mockRepo.isPremium(anyLong())).thenReturn(true);
        DiscountService service = new DiscountService(mockRepo);
    
        // Act: Вызываем метод
        double result = service.calculateDiscount(100.0, 123L);
    
        // Assert: Проверяем результат
        assertEquals(90.0, result, 0.001);
    }
  2. Фокус на поведении: Тестирую публичный контракт (public API) компонента — что он принимает, что возвращает и какие исключения бросает. Избегаю тестирования приватных методов.
  3. Структура AAA (Arrange-Act-Assert): Четко разделяю этапы подготовки, выполнения и проверки для читаемости.
  4. Именование тестов: Использую шаблоны вроде MethodName_StateUnderTest_ExpectedBehavior. Например, processOrder_WithNullItems_ThrowsIllegalArgumentException.

Ключевые инструменты в QA/тестировании: JUnit/TestNG (Java), pytest (Python), NUnit (.NET), Jest (JavaScript).