Тестирование приложений Node.js на реальных примерах
Тестирование — важнейшая часть разработки программного обеспечения. Это гарантирует, что ваше приложение работает должным образом, и помогает выявить ошибки на ранней стадии.
В этом руководстве будет описано, как тестировать различные типы приложений Node.js, включая простой веб-сервер, REST API и приложение командной строки. Для иллюстрации концепций мы будем использовать примеры реального кода и лучшие практики.
Предварительные условия
Чтобы следовать этому руководству, у вас должны быть установлены Node.js и npm. Кроме того, вам необходимо установить Jest для тестирования:
npm install --save-dev jest
Тестирование простого веб-сервера
Во-первых, давайте начнем с тестирования простого веб-сервера с использованием модуля http.
Настройка веб-сервера
Создайте файл с именем server.js
:
// server.js
const http = require('http');
const server = http.createServer((req, res) => {
if (req.method === 'GET' && req.url === '/') {
res.writeHead(200, { 'Content-Type': 'text/plain' });
res.end('Hello, world!');
} else {
res.writeHead(404, { 'Content-Type': 'text/plain' });
res.end('Not Found');
}
});
const PORT = process.env.PORT || 3000;
server.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
module.exports = server;
Это простой HTTP-сервер, который отвечает «Привет, мир!» для GET-запросов к корневому URL-адресу.
Написание тестов для веб-сервера
Теперь давайте напишем несколько тестов для этого сервера. Создайте файл с именем server.test.js
:
// server.test.js
const request = require('supertest');
const server = require('./server');
describe('Simple Web Server', () => {
afterAll(() => {
server.close();
});
it('should respond with "Hello, world!"', async () => {
const response = await request(server).get('/');
expect(response.status).toBe(200);
expect(response.text).toBe('Hello, world!');
});
it('should respond with 404 for other routes', async () => {
const response = await request(server).get('/nonexistent');
expect(response.status).toBe(404);
expect(response.text).toBe('Not Found');
});
});
В этом тестовом файле мы используем супертест для отправки запросов на наш сервер и проверки ответов.
Тестирование REST API
Далее давайте протестируем REST API, созданный с помощью Express.
Настройка REST API
Создайте файл с именем app.js
:
// app.js
const express = require('express');
const bodyParser = require('body-parser');
const app = express();
app.use(bodyParser.json());
let items = [];
app.get('/items', (req, res) => {
res.status(200).json(items);
});
app.post('/items', (req, res) => {
const newItem = req.body;
items.push(newItem);
res.status(201).json(newItem);
});
app.delete('/items/:id', (req, res) => {
const { id } = req.params;
items = items.filter(item => item.id !== parseInt(id, 10));
res.status(204).send();
});
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server is running on port ${PORT}`);
});
module.exports = app;
Это простой REST API с конечными точками для получения, создания и удаления элементов.
Написание тестов для REST API
Создайте файл с именем app.test.js
:
// app.test.js
const request = require('supertest');
const app = require('./app');
describe('REST API', () => {
let newItem;
it('should create a new item', async () => {
newItem = { id: 1, name: 'Test Item' };
const response = await request(app).post('/items').send(newItem);
expect(response.status).toBe(201);
expect(response.body).toEqual(newItem);
});
it('should get all items', async () => {
const response = await request(app).get('/items');
expect(response.status).toBe(200);
expect(response.body).toEqual([newItem]);
});
it('should delete an item', async () => {
const response = await request(app).delete(`/items/${newItem.id}`);
expect(response.status).toBe(204);
const getResponse = await request(app).get('/items');
expect(getResponse.status).toBe(200);
expect(getResponse.body).toEqual([]);
});
});
В этом тестовом файле мы тестируем создание, извлечение и удаление элементов в REST API.
Тестирование приложения командной строки
Наконец, давайте протестируем простое приложение командной строки.
Настройка приложения командной строки
Создайте файл с именем cli.js
:
// cli.js
const fs = require('fs');
const filePath = './data.txt';
function readData() {
return fs.readFileSync(filePath, 'utf-8');
}
function writeData(data) {
fs.writeFileSync(filePath, data);
}
function clearData() {
fs.unlinkSync(filePath);
}
module.exports = { readData, writeData, clearData };
if (require.main === module) {
const command = process.argv[2];
const data = process.argv[3];
if (command === 'read') {
console.log(readData());
} else if (command === 'write') {
writeData(data);
console.log('Data written successfully');
} else if (command === 'clear') {
clearData();
console.log('Data cleared successfully');
} else {
console.log('Unknown command');
}
}
Это приложение командной строки считывает, записывает и очищает данные в текстовом файле.
Написание тестов для приложения командной строки
Создайте файл с именем cli.test.js
:
// cli.test.js
const fs = require('fs');
const { readData, writeData, clearData } = require('./cli');
describe('Command-line Application', () => {
const filePath = './data.txt';
afterEach(() => {
if (fs.existsSync(filePath)) {
fs.unlinkSync(filePath);
}
});
it('should write data to a file', () => {
const data = 'Test data';
writeData(data);
const fileContent = fs.readFileSync(filePath, 'utf-8');
expect(fileContent).toBe(data);
});
it('should read data from a file', () => {
const data = 'Test data';
fs.writeFileSync(filePath, data);
const fileContent = readData();
expect(fileContent).toBe(data);
});
it('should clear data from a file', () => {
const data = 'Test data';
fs.writeFileSync(filePath, data);
clearData();
expect(fs.existsSync(filePath)).toBe(false);
});
});
В этом тестовом файле мы тестируем функции чтения, записи и очистки приложения командной строки.
Заключение
Тестирование — жизненно важная часть разработки надежных приложений Node.js. В этом руководстве мы рассмотрели:
- Тестирование простого веб-сервера: использование модуля http и супертеста.
- Тестирование REST API: использование Express и супертеста.
- Тестирование приложения командной строки: использование модуля fs для операций с файлами.
Следуя этим примерам и рекомендациям, вы можете быть уверены, что ваши приложения Node.js тщательно протестированы и надежны.
Приятного тестирования!