Что такое модульное (Unit) тестирование?

«Что такое модульное (Unit) тестирование?» — вопрос из категории Тестирование, который задают на 26% собеседований Node.js Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

В контексте Node.js это особенно важно из-за его асинхронной природы. Для тестирования используются специальные библиотеки и подходы:

  • Изоляция зависимостей: Внешние сервисы (базы данных, API) заменяются моками (mocks) или стабами (stubs) с помощью библиотек вроде sinon или встроенных возможностей Jest.
  • Асинхронный код: Тесты должны корректно обрабатывать промисы и колбэки. Jest и Mocha предоставляют для этого специальный синтаксис (async/await, done-колбэк).
  • Интеграция в процесс: Unit-тесты обычно выполняются быстро и являются частью пайплайна CI/CD.

Пример модульного теста для Node.js-функции с использованием Jest:

// utils/calculate.js
function calculateDiscount(price, discountPercent) {
    if (price <= 0 || discountPercent < 0) {
        throw new Error('Invalid input parameters');
    }
    return price * (1 - discountPercent / 100);
}

module.exports = { calculateDiscount };
// utils/calculate.test.js
const { calculateDiscount } = require('./calculate');

describe('calculateDiscount', () => {
    test('should apply correct discount', () => {
        expect(calculateDiscount(100, 20)).toBe(80);
    });

    test('should throw error for negative price', () => {
        expect(() => calculateDiscount(-10, 5)).toThrow('Invalid input parameters');
    });

    test('should handle zero discount', async () => {
        // Пример с асинхронным тестом, если бы функция была async
        const result = calculateDiscount(100, 0);
        expect(result).toBe(100);
    });
});

Популярные инструменты в экосистеме Node.js: Jest (чаще всего, "из коробки" имеет всё необходимое), Mocha в связке с Chai (для assertions) и Sinon (для моков). Модульные тесты — это фундамент надёжности приложения, они позволяют безопасно рефакторить код и ловить регрессии на ранней стадии.