본문 바로가기
nodejs

[node.js] TDD 라이브러리 - mocha, assert, should, supertest

by jinbro 2017. 6. 12.
[TDD : Test Driven Develop]
- 테스트 주도 개발 : 처음부터 모든 기능을 개발하기보다 테스트 코드를 먼저 개발하고 테스트 한 뒤 개발
- 테스트 해보고 원하는 결과값이 나오는지 확인하고!
- 유지 보수할 때 좋다함 : 느껴봐야지


[nodejs에서 TDD]
- mocha, should, superTest 라이브러리를 사용함

1) mocha : 테스트 코드 작성 후 실행 해보는 테스트 러너, 테스트 베이스를 만들기 쉬움, 테스트 결과를 알기쉽게 보여줌
- 공식페이지 : https://mochajs.org/
- 테스트 수트와 테스트 케이스로 이뤄져있음
- 테스트 수트 : 테스트 환경을 말함, describe() 로 구현
- 테스트 케이스 : 테스트(테스트 코드 생성)를 말함, it() 로 구현


(1) npm i mocha --save-dev : npm으로 설치, package.json 의존 모듈 등록(개발환경에서만 사용)


(2) utils.js : 테스트할 코드 작성, 모듈화 시키기 - 테스트 수트에서 사용할 것이기 때문에
var capitalize = function(str){
     var temp = str.substring(1, str.length);
     return str.charAt(0).toUpperCase() + temp.toLowerCase();
}

module.exports = { capitalize: capitalize };



(3) util.spec.js : .js 앞에 .spec이 붙어있으면 테스트코드라 보면 됨, 테스트 코드 작성
const assert = require('assert');

describe("", ()=>{
     it("", ()=>{
          let result = utils.capitalize("finally");
          assert.equal(result, "Finally");
     });
})

- assert : 테스트 코드 실행-비교를 위해 사용할 nodejs 내장 모듈, 지정한 값과 실행 결과값이 동일한지 알아보는 equal 메서드

- describe 첫번째 파라미터 : 테스트에 대한 설명
- describe 두번째 파라미터 : 테스트 케이스 코드 - it() 함수
- it 첫번째 파라미터 : 테스트 결과에 대한 설명
- it 두번째 파라미터 : 테스트 코드 - utils 모듈 함수 실행 및 지정 결과값(assert 테스트를 위한 내장모듈) 비교


(4) mocha 실행 : 테스트 수트, 케이스 작성하고 테스트 런까지
$ node_modules/.bin/mocha utils.spec.js

- npm 명령어로 실행하지못함

- mocha 모듈 패키지 내 실행파일로 .spec.js 코드 실행
- mocha로 실행하면 테스트 결과가 아래와 같이 보기 좋게 나옴



(5) mocha + assert 정리
- 테스트 수트, 케이스 : 테스트를 위한 환경을 만들어줌
- mocha 모듈 패키지 내 실행파일로 테스트 코드 실행
- assert : 실행 결과를 비교하기위해 사용하는 내장 모듈, 테스트할 때 가장 필요한 모듈이겠지?
- 코드 모듈화 : 모듈화된 코드 로드해서 테스트(단위테스트 - 하나의 함수에 대해 테스트)


2) should
- 테스트 코드를 검증할 때 사용하는 써드파티 라이브러리
- 공식페이지(github readme.md) : https://github.com/shouldjs/should.js/
- assert는 nodejs 공식 모듈, should 써드파티 모듈

(1) npm i --save-dev should : 설치하기, devDependencies 추가

(2) utils.spec.js : 테스트 케이스 수정
const utils = require('./utils');
const should = require('should');

describe('~~~', () =>{
     it('~~~~', () => {
          const result = utils.capitalize('hElLo');
          result.should.be.equal('Hello');
     })
});

- 직관적인 테스트 실행 코드 



3) SuperTest 
- mocha가 하나의 함수를 테스트했다면, 통합테스트(api 기능 테스트)에서 사용하는 라이브러리
- api 서버라면 내부적으로 express 구동 -> 요청보낸 뒤 결과 검증까지함(시나리오 코드 작성)
- 공식 api 문서(github readme.md) : https://github.com/visionmedia/supertest

(1) npm i supertest --save-dev, mocha까지 설치하기 : 설치를 해줌

(2) index.js 작성 : express 설치되어있는 상태
const request = require('supertest');

const express = require('express');
const app = express();
const port = 3000;

app.get('/users', (req, res) =>{
   res.status(200)
      .json({name: 'jinbro'});
});

app.listen(port, ()=>{
  console.log("server is running");
});

module.exports = app;

- 모듈화 시키기



(3) index.spec.js 작성 : index.js 테스트 코드
const app = require('./index');
const request = require('supertest');

describe('GET /users는', ()=>{
  it('json을 리턴한다.', (done)=> {
    request(app)
        .get('/users')
        .expect('Content-Type', /json/)
        .expect('Content-Length', '17')
        .expect(200)
        .end((err, result) => {
            if(err){
                  done(err);
            } else {
                 done();
                 console.log(result.body);
            } 
        });
  });
});

- mocha로 테스트코드를 돌릴 예정 

- done() : api 서버는 비동기로 동작하게 되어있음, 응답 받은 후 done() - 테스트 완료처리 함수
=> mocha api문서 참고 : https://mochajs.org/   ---> ASYNCHRONOUS CODE 검색


(4) 테스트 코드 실행 
$ node_modules/.bin/mocha index.spec.js

- 아래는 테스트 코드 실행 후 이미지



[정리]
- mocha : 테스트를 위한 환경설정 간단하게 해줌
- assert, should : 테스트 결과를 가지고 작업을 할 수 있게 해줌
- supertest : 테스트 환경에서 api 테스트할 수 있게 해줌


[참고자료]
- 개인블로그, Asset: node.js 테스트 모듈 : https://hyunseob.github.io/2016/05/09/assert-nodejs-test-module/

- MDN, String.prototype : https://goo.gl/dQ0mfj



댓글