Тестирование в JavaScript (Node.js): фреймворки и инструменты
Качественное тестирование — неотъемлемая часть разработки на Node.js. Оно позволяет выявлять ошибки на ранних стадиях, упрощает рефакторинг и повышает надёжность приложений. В экосистеме JavaScript существует множество фреймворков и утилит для тестирования. В этой статье мы рассмотрим основные инструменты, их возможности и приведём практические примеры.
1. Основные типы тестов
Прежде чем выбирать инструмент, важно понимать, какие виды тестов вы будете писать:
- Модульные (Unit) тесты — проверяют отдельные функции или модули изолированно.
- Интеграционные тесты — проверяют взаимодействие между несколькими модулями, базой данных или внешними API.
- End-to-End (E2E) тесты — симулируют действия пользователя в браузере или полном приложении.
2. Jest — универсальный фреймворк от Facebook
Jest — самый популярный фреймворк для тестирования JavaScript. Он включает в себя всё необходимое: тест-раннер, библиотеку утверждений (assertions), моки и встроенную поддержку покрытия кода.
Установка:
npm install --save-dev jest
Пример простого unit-теста для функции сложения:
// sum.js
function sum(a, b) {
return a + b;
}
module.exports = sum;
// sum.test.js
const sum = require('./sum');
test('сложение 1 + 2 равно 3', () => {
expect(sum(1, 2)).toBe(3);
});
Запуск тестов:
npx jest
Преимущества Jest:
- Нулевая конфигурация для проектов на React и Node.
- Автоматический запуск в watch-режиме.
- Встроенные моки и шпионы.
- Поддержка асинхронного кода (async/await, callbacks).
3. Mocha + Chai — гибкая связка
Mocha — это гибкий тест-раннер, который не навязывает библиотеку утверждений. Чаще всего его используют вместе с Chai — библиотекой с понятным синтаксисом (should, expect, assert).
Установка:
npm install --save-dev mocha chai
Пример теста с Chai:
// calculator.js
function divide(a, b) {
if (b === 0) throw new Error('Division by zero');
return a / b;
}
module.exports = { divide };
// test.js
const { expect } = require('chai');
const { divide } = require('./calculator');
describe('Calculator', function() {
it('should divide two numbers', function() {
expect(divide(10, 2)).to.equal(5);
});
it('should throw error when dividing by zero', function() {
expect(() => divide(10, 0)).to.throw('Division by zero');
});
});
Запуск:
npx mocha test.js
Mocha особенно удобен, когда нужна тонкая настройка отчётов и интеграция с другими инструментами.
4. Supertest — тестирование HTTP-серверов
Supertest — это библиотека для интеграционного тестирования Express (и других) серверов. Она позволяет отправлять HTTP-запросы и проверять ответы.
Установка:
npm install --save-dev supertest
Пример теста для Express-приложения:
// app.js
const express = require('express');
const app = express();
app.get('/hello', (req, res) => res.json({ message: 'Hello World' }));
module.exports = app;
// app.test.js
const request = require('supertest');
const app = require('./app');
describe('GET /hello', function() {
it('responds with json', function(done) {
request(app)
.get('/hello')
.expect('Content-Type', /json/)
.expect(200)
.then(response => {
expect(response.body.message).toBe('Hello World');
done();
});
});
});
Supertest отлично сочетается с Jest или Mocha.
5. Sinon — моки, шпионы и стабы
Sinon — это автономная библиотека для создания тестовых двойников (test doubles). Она позволяет заменять функции, отслеживать вызовы и имитировать поведение зависимостей.
Установка:
npm install --save-dev sinon
Пример использования шпиона (spy):
const sinon = require('sinon');
function greet(name, cb) {
cb(`Hello, ${name}`);
}
describe('greet function', function()