Интеграционное тестирование предназначено для проверки взаимодействия между модулями или компонентами системы. В отличие от модульного тестирования, где фокус делается на отдельных функциях или классах, интеграционные тесты оценивают работу нескольких компонентов вместе, выявляя ошибки, которые проявляются только при их совместном использовании.
Для интеграционного тестирования в экосистеме JavaScript чаще всего используются:
Интеграционные тесты обычно включают следующие элементы:
Подготовка окружения
Вызов функций или API
Проверка состояния и результата
async/await или промисами.const request = require('supertest');
const app = require('../app'); // Экземпляр Express
describe('User API Integration', () => {
let createdUserId;
beforeAll(async () => {
// Подготовка тестовой базы данных
await resetTestDatabase();
});
it('should create a new user', async () => {
const response = await request(app)
.post('/users')
.send({ name: 'John Doe', email: 'john@example.com' });
expect(response.statusCode).toBe(201);
expect(response.body).toHaveProperty('id');
createdUserId = response.body.id;
});
it('should fetch the created user', async () => {
const response = await request(app).get(`/users/${createdUserId}`);
expect(response.statusCode).toBe(200);
expect(response.body.name).toBe('John Doe');
});
afterAll(async () => {
// Очистка тестовой базы данных
await clearTestDatabase();
});
});
Интеграционные тесты UI-компонентов оценивают не только отрисовку, но и взаимодействие с другими компонентами и состояние приложения:
Пример интеграционного теста компонента с React Testing Library:
import { render, screen, fireEvent } from '@testing-library/react';
import App from '../App';
test('user can submit form and see result', async () => {
render(<App />);
fireEvent.change(screen.getByLabelText(/username/i), {
target: { value: 'John' }
});
fireEvent.click(screen.getByText(/submit/i));
const result = await screen.findByText(/welcome, John/i);
expect(result).toBeInTheDocument();
});
Интеграционное тестирование в JavaScript обеспечивает уверенность в том, что отдельные части приложения корректно взаимодействуют между собой и с внешними сервисами, что является ключевым аспектом надёжной разработки сложных систем.