DevGang
Авторизоваться

Тестирование приложений Node.js на реальных примерах

Тестирование — важнейшая часть разработки программного обеспечения. Это гарантирует, что ваше приложение работает должным образом, и помогает выявить ошибки на ранней стадии.

В этом руководстве будет описано, как тестировать различные типы приложений Node.js, включая простой веб-сервер, REST API и приложение командной строки. Для иллюстрации концепций мы будем использовать примеры реального кода и лучшие практики.

Предварительные условия

Чтобы следовать этому руководству, у вас должны быть установлены Node.js и npm. Кроме того, вам необходимо установить Jest для тестирования:

npm install --save-dev jest

Тестирование простого веб-сервера

Во-первых, давайте начнем с тестирования простого веб-сервера с использованием модуля http.

Настройка веб-сервера

Создайте файл с именем server.js:

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
// 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
// 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
// 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
// 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 тщательно протестированы и надежны.

Приятного тестирования!

Источник:

#NodeJS #Testing
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу