Node.js
Mocha 로 하는 API Testing
InspiredJW
2016. 8. 15. 10:33
Mocha 로 하는 API Testing
지난 번 Mocha 로 하는 JavaScript Testing 에서는 기본적으로 Mocha를 사용해서 Node.js 환경에서 Unit Test 하는 방법을 알아보았습니다.
이번에는 API endpoint에 대해 테스팅하는 방법을 알아보겠습니다.
Setup
Mocha 로 하는 JavaScript Testing 에 작업 디렉토리에서 이어서 하겠습니다.
우선 chai-http
를 추가해줍니다.
npm install chai-http
또 간단한 예제 API를 만들어보기 위해서 express
를 추가합니다.
npm install express
POST의 body parsing을 위해 body-parser
,
POST, GET 뿐만 아니라 PUT, DELETE를 사용하기 위해 method-override
를 추가합니다.
npm install body-parser method-override
Code
Sample API endpoint 코드를 씁니다
여기서 사용하는 HTTP Status Code는 200, 201, 404, 500 입니다.
간단히 살펴보는 HTTP Status Code 를 참고하세요.
// app.js
'use strict';
let express = require('express');
let bodyParser = require('body-parser');
let methodOverride = require('method-override');
let app = express();
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({
extended: true
}));
app.use(methodOverride());
app.get('/', (req, res) => {
res.send('Hello World!');
});
app.post('/user', (req, res) => {
res.status(201).json({
status: 'success',
userId: req.body.userId
});
});
app.put('/user/:id', (req, res) => {
res.json({
status: 'updated',
userId: req.params.id,
data: req.body.data
});
});
app.delete('/user/:id', (req, res) => {
res.json({
status: 'deleted',
userId: req.params.id
});
});
app.use((req, res, next) => {
let err = new Error('Not Found');
err.status = 404;
next(err);
});
app.use((err, req, res, next) => {
res.status(err.status || 500);
res.render('error', {
message: err.message,
error: {},
title: 'error'
});
});
app.listen(3000, () => {
console.log('Example app listening on port 3000!');
});
module.exports = app;
Test
방금 전 작성한 Sample API Endpoint에 맞춰 여러가지 테스트를 작성합니다.
작성할 테스트는 아래와 같습니다.
- [GET] /
- [POST] /user
- [PUT] /user/:id
- [DELETE] /user/:id
- 404 Not Found
// test/apiTest.js
'use strict';
let chai = require('chai');
let chaiHttp = require('chai-http');
let should = chai.should();
let server = require('../app');
chai.use(chaiHttp);
describe('API Endpoint Test', () => {
describe('GET request on /', () => {
it('should return hello world', (done) => {
chai.request(server)
.get('/')
.end((err, res) => {
res.should.have.status(200);
done();
});
});
});
describe('POST request on /user with data', () => {
it('should return 201', (done) => {
let params = {
userId: '123'
};
chai.request(server)
.post('/user')
.send(params)
.end((err, res) => {
res.should.have.status(201);
res.body.status.should.equal('success');
res.body.userId.should.equal(params.userId);
done();
});
});
});
describe('PUT request on /user with data', () => {
it('should return update data', (done) => {
let params = {
data: 'abc'
};
chai.request(server)
.put('/user/123')
.send(params)
.end((err, res) => {
res.should.have.status(200);
res.body.status.should.equal('updated');
res.body.data.should.equal('abc');
done();
});
});
});
describe('DELETE request on /user', () => {
it('should return deleted userId', (done) => {
chai.request(server)
.delete('/user/123')
.end((err, res) => {
res.should.have.status(200);
res.body.status.should.equal('deleted');
res.body.userId.should.equal('123');
done();
});
});
});
describe('request on unknown uri', () => {
it('should return 404', (done) => {
chai.request(server)
.get('/nowhere')
.end((err, res) => {
res.should.have.status(404);
done();
});
});
});
});
이렇게 테스트 구성 후
mocha
실행하면 지난 번 포스트에서 작성했던 간단한 유닛 테스트와 방금 작성한 API Endpoint 테스트 결과를 다 확인할 수 있습니다.
Code in GitHub
지난 번 포스트 Mocha 로 하는 JavaScript Testing 부터 이어진 이번 포스트 내용은 모두 Github Repo 에서 확인할 수 있습니다.
이어지는 내용으로 GitHub Repo에 Travis CI 추가하기 가 있습니다.