Тестирование REST API

Тестирование REST API в современных приложениях является неотъемлемой частью процесса разработки. Одним из популярных инструментов для тестирования в JavaScript является Mocha — фреймворк для написания и выполнения тестов. В этой главе рассмотрим, как с помощью Mocha тестировать REST API, а также как интегрировать его с другими инструментами для проверки корректности работы API.

Установка Mocha

Для начала необходимо установить Mocha и все требуемые зависимости. Для этого достаточно выполнить команду:

npm install --save-dev mocha chai supertest
  • Mocha — сам фреймворк для тестирования.
  • Chai — библиотека утверждений, которая упрощает написание ассертов.
  • Supertest — инструмент для тестирования HTTP запросов, идеально подходящий для тестирования REST API.

Структура тестов

Тестирование API обычно включает в себя следующие этапы:

  1. Отправка запросов к API.
  2. Проверка статуса ответа.
  3. Проверка содержимого ответа.
  4. Проверка обработки ошибок.

Mocha позволяет разделить тесты на describe блоки, которые группируют похожие тесты. Каждый тест в Mocha описывается с помощью функции it.

Пример базовой структуры теста:

const request = require('supertest');
const app = require('../app'); // Подключение приложения (API)

describe('GET /api/users', () => {
  it('should return a list of users', (done) => {
    request(app)
      .get('/api/users')
      .expect(200)
      .end((err, res) => {
        if (err) return done(err);
        res.body.should.be.an('array'); // Проверка, что ответ — массив
        done();
      });
  });
});

Основные виды запросов

Mocha, в сочетании с Supertest, позволяет легко отправлять различные типы HTTP-запросов.

  1. GET — для получения данных.
  2. POST — для отправки данных.
  3. PUT — для обновления данных.
  4. DELETE — для удаления данных.

Каждый запрос можно дополнить проверками статуса ответа, типа контента и содержания данных.

Пример GET запроса:

it('should return 200 OK for valid endpoint', (done) => {
  request(app)
    .get('/api/users/1')
    .expect(200)
    .end((err, res) => {
      if (err) return done(err);
      res.body.should.have.property('id').eql(1);
      done();
    });
});

Пример POST запроса:

it('should create a new user', (done) => {
  const newUser = {
    name: 'John Doe',
    email: 'john@example.com'
  };

  request(app)
    .post('/api/users')
    .send(newUser)
    .expect(201)
    .end((err, res) => {
      if (err) return done(err);
      res.body.should.have.property('name').eql('John Doe');
      done();
    });
});

Использование Chai для ассертов

Chai предоставляет различные методы для проверки результатов. В тестах можно использовать три основных типа утверждений:

  • expect — для выражения ожиданий.
  • should — для использования утверждений в стиле OOP.
  • assert — для базовых утверждений.

Пример с использованием expect:

it('should return a user with status 200', (done) => {
  request(app)
    .get('/api/users/1')
    .expect(200)
    .end((err, res) => {
      expect(res.body).to.have.property('id').that.equals(1);
      done();
    });
});

Пример с использованием should:

it('should return status 404 for non-existent user', (done) => {
  request(app)
    .get('/api/users/999')
    .expect(404)
    .end((err, res) => {
      res.body.should.have.property('error').eql('User not found');
      done();
    });
});

Асинхронные тесты и обработка ошибок

В случае асинхронных запросов важно правильно обрабатывать ошибки. Mocha предоставляет два способа для этого: использование функции done и возвращение промисов.

Пример с использованием done:

it('should return status 500 on server error', (done) => {
  request(app)
    .get('/api/users/invalid')
    .expect(500)
    .end((err, res) => {
      if (err) return done(err);
      done();
    });
});

Пример с промисом:

it('should return status 404 for nonexistent endpoint', () => {
  return request(app)
    .get('/api/nonexistent')
    .expect(404);
});

Тестирование ошибок

Особое внимание следует уделить тестированию обработки ошибок. REST API должно корректно обрабатывать различные исключительные ситуации и возвращать правильные коды состояния (например, 400 — Bad Request, 404 — Not Found, 500 — Internal Server Error).

Пример теста для проверки несуществующего ресурса:

it('should return 404 for non-existent user', (done) => {
  request(app)
    .get('/api/users/999')
    .expect(404)
    .end((err, res) => {
      if (err) return done(err);
      res.body.should.have.property('error').eql('User not found');
      done();
    });
});

Настройка окружения для тестирования

Для удобства тестирования REST API полезно настроить отдельную базу данных или другие ресурсы, которые будут использоваться только в процессе тестирования. Это помогает избежать изменения данных в продакшн-среде и ускоряет тестирование.

Многие разработчики используют библиотеку dotenv для настройки переменных окружения, таких как URL базы данных, токены доступа и другие параметры.

npm install dotenv

В файле .env можно указать настройки для тестирования:

DB_URI=mongodb://localhost:27017/test_db
API_KEY=test-api-key

Затем, в коде тестов, подключаем dotenv:

require('dotenv').config();

Тестирование аутентификации и авторизации

REST API часто требует аутентификации. Тестирование таких эндпоинтов может включать проверку токенов доступа, куки или других механизмов аутентификации.

Пример теста с авторизацией по токену:

it('should return 401 if no token is provided', (done) => {
  request(app)
    .get('/api/protected')
    .expect(401)
    .end(done);
});

it('should return 200 if valid token is provided', (done) => {
  const token = 'valid-token';
  request(app)
    .get('/api/protected')
    .set('Authorization', `Bearer ${token}`)
    .expect(200)
    .end(done);
});

Использование хука before и after

Mocha предоставляет хуки, такие как before, beforeEach, after, и afterEach, которые позволяют настроить и очистить окружение перед и после тестов.

Пример использования before и after:

before((done) => {
  // Настройка базы данных или других зависимостей
  done();
});

after((done) => {
  // Очистка базы данных или других зависимостей
  done();
});

Запуск тестов

Для запуска тестов можно использовать команду:

npx mocha

Тесты будут выполнены, и в консоли будет выведен результат. Для удобства можно добавить скрипт в package.json:

"scripts": {
  "test": "mocha"
}

Теперь тесты можно запускать с помощью команды:

npm test

Логирование и отладка

При тестировании API полезно добавлять логирование для отслеживания запросов и ответов. Также для отладки можно использовать инструменты, такие как debug или winston.

Резюме

Mocha в сочетании с Supertest и Chai — мощный инструмент для тестирования REST API. Он позволяет легко создавать, выполнять и проверять тесты, обеспечивая высокое качество и надежность API. Отправка запросов, проверка статусов, содержимого ответов и обработка ошибок — все это реализуется просто и понятно с помощью этих инструментов.