Inspired World

Mocha 로 하는 API Testing 본문

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 추가하기 가 있습니다.


Comments