Тестирование REST API в современных приложениях является неотъемлемой частью процесса разработки. Одним из популярных инструментов для тестирования в JavaScript является Mocha — фреймворк для написания и выполнения тестов. В этой главе рассмотрим, как с помощью Mocha тестировать REST API, а также как интегрировать его с другими инструментами для проверки корректности работы API.
Для начала необходимо установить Mocha и все требуемые зависимости. Для этого достаточно выполнить команду:
npm install --save-dev mocha chai supertest
Тестирование API обычно включает в себя следующие этапы:
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-запросов.
Каждый запрос можно дополнить проверками статуса ответа, типа контента и содержания данных.
Пример 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 предоставляет различные методы для проверки результатов. В тестах можно использовать три основных типа утверждений:
Пример с использованием 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 и afterMocha предоставляет хуки, такие как 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. Отправка запросов, проверка статусов, содержимого ответов и обработка ошибок — все это реализуется просто и понятно с помощью этих инструментов.