(수근수근)

[NodeJS]테스트 주도개발 본문

type & Javascript

[NodeJS]테스트 주도개발

InformationFarm 2021. 10. 3. 18:15

해당 내용은 인프런의 '테스트주도개발(TDD)로 만드는 NodeJS API 서버'를 정리한 내용입니다.

테스트주도개발(TDD)이란?

개발을 먼저 진행하지 않고, 테스트 코드를 먼저 작성하는 것

  • 개발시간이 많이 걸리긴 하지만 유지보수 시점에 가면 좋은 효율성을 가져다 준다.

모카(Mocha)

https://mochajs.org/

  • 모카는 테스트 코드를 돌려주는 테스트 러너
  • 테스트 수트 : 테스트 환경으로 모카에서는 describe()으로 구현한다
  • 테스트 케이스 : 실제 테스트를 말하며 모카에서는 it()으로 구현한다

npm install mocha 명렁을 실행합니다.

1. utils.js에 테스트를 진행할 코드를 작성합니다.

//테스트를 진행할 코드
function capitalize(str){
    return str;
}

module.exports  = {
    capitalize : capitalize
}

2. 테스트 코드를 작성합니다. (util.spec.js)

//테스트 코드는 명세서 요구사항으로 보면된다
const utils = require('./utils');
//테스트 검증모드
const assert = require('assert');

//테스트 환경만들기

describe('utils.js 모듈의 Catitalize() 함수는 ', ()=>{
    it('문자열의 첫번쨰 문자를 대문자로 반환한다', ()=>{
       //테스트 코드를 작성하는 란
        const result = utils.capitalize('hello');
        assert.equal(result,'Hello');
    })
})

3. 테스트 코드를 실행합니다.

해당 코드는 node에서 돌려주는 것이 아니라 mocha가 돌려준다

  • mocha의 위치는 D:\node-api\apiserver\node_modules.bin에 있습니다.
  • D:\node-api\apiserver\node_modules.bin로 이동
  • mocha utils.spec.js 명령어 실행
  • 만약 에러가 아래와 같은 에러가 발생한다면?

→ 파일경로가 제대로 되어있지 않으면 불러오지 못합니다.

  • cmd관리자 권한으로 실행시켜줍니다.

→ 결과

  • 테스트실패라고 보고합니다.
  • Hello를 원하는데 hello를 반환함
    • 원인 : capitalize 함수는 그대로 반환만 함
  • 코드를 변경합시다
//테스트를 진행할 코드
function capitalize(str){
    return str.charAt(0).toUpperCase() + str.slice(1);
}
  • 다시 mocha를 실행해본다면?

→ 성공했다는 화면을 띄어줍니다.


Should 라이브러리

https://shouldjs.github.io/

https://github.com/tj/should.js/

should라이브러리를 사용하기 위해 npm install should 실행합니다

  • 노드 assert 말고 서드파티 라이브러리를 사용하라(node공식문서) → assert는 테스트 코드에서 사용하지 마라
  • should는 검증(assertion)라이브러리다
  • 가독성 높은 테스트 코드를 만들 수 있다.

위에서 nodejs가 지원하는 Assert모듈을 should.js로 변경해보겠습니다.

const utils = require('./utils');
//테스트 검증모드
const should = require('should');

//테스트 환경만들기
describe('utils.js 모듈의 Catitalize() 함수는 ', ()=>{
    it('문자열의 첫번쨰 문자를 대문자로 반환한다', ()=>{
        const result = utils.capitalize('hello');
        //테스트 코드의 가독성이 좋아진다.
        result.should.be.equal('Hello');
    })
})

 

→ 결과

 


SuperTest 라이브러리

https://github.com/visionmedia/supertest

npm install supertest를 통해 라이브러리를 설치해줍니다.

지금까지는 하나의 함수를 테스트 했다(단위테스트). 슈퍼테스트는 통합테스트에서 사용하는 것입니다. (통합테스트는 API의 기능테스트를 의미합니다)

  • 단위테스트 : 함수의 기능테스트
  • 통합테스트 : API기능 테스트
  • 슈퍼테스트는 익스프레스 통합 테스트용 라이브러리입니다.
  • 내부적으로 express서버를 구동시켜 실제 요청을 보낸 뒤 결과를 검증합니다.

처음 만들었던 API를 테스트해봅시다.

실제 API서버(index.js)

var express = require('express'); //모듈가지고 오기
var app = express(); // 할당
var morgan = require('morgan');

var users = [
    { id:1, name:'주하'},
    { id:2, name:'민하'},
    { id:3, name:'세하'},
];

app.use(morgan('dev'));

app.get('/users', function (req, res) {
  res.json(users);
});


app.listen(3040, function () {
  console.log('Example app listening on port 3030!');
}); 

module.exports = app;  //객체를 할당

 

테스트케이스 만들기(index.spec.js)

const app = require('./index');
const request = require('supertest')

describe('GET /users는 ', () =>{
    //두번째 함수에서 슈퍼테스트 실행시킨다
    it('...',(done)=>{  //nodejs는 비동기로 돌기때문에 테스트가 끝나는 시점에 done을 호출해주기만 하면된다. 
        request(app)
            .get('/users')
            .end((err, res)=>{
                console.log(res.body)
                done();
            })
    })
})

→ 결과

'type & Javascript' 카테고리의 다른 글

TDD로 하는 API 서버 개발 -(2)  (0) 2021.10.16
TDD 로 하는 API 서버 개발 -(1)  (0) 2021.10.14
[NodeJS] REST API란  (0) 2021.10.03
[ NodeJS ] Express 기초  (0) 2021.10.03
[NodeJS] Hello Node  (0) 2021.10.03
Comments