(수근수근)
[NodeJS]테스트 주도개발 본문
해당 내용은 인프런의 '테스트주도개발(TDD)로 만드는 NodeJS API 서버'를 정리한 내용입니다.
테스트주도개발(TDD)이란?
개발을 먼저 진행하지 않고, 테스트 코드를 먼저 작성하는 것
- 개발시간이 많이 걸리긴 하지만 유지보수 시점에 가면 좋은 효율성을 가져다 준다.
모카(Mocha)
- 모카는 테스트 코드를 돌려주는 테스트 러너
- 테스트 수트 : 테스트 환경으로 모카에서는 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://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