테스트 주도 개발 TDD
Test Driven Development
노드에서는 mocha, should, superTest 등의 라이브러리를 사용해서 TDD를 할 수 있다.
TDD를 할 수 있는 대표적인 자바스크립트 프레임워크로 테스트코드를 실행하는 테스트 러너(test runner)
npm i mocha --save-dev
node_modules/.bin/mocha utils.spec.js
#1 노드에서 제공하는 assert
모듈을 사용해서 capitalize와 add 함수가 동작하는지 확인하는 테스트 코드를 작성해보자.
assert.equal(actual, expected[, message])
== operator
로 두 값을 비교하며, 두 값이 모두 NaN
인 경우 일치하는 것으로 간주한다. assert.strictEqual()
사용을 권장한다. AssertionError
가 발생하는데, 이때 message 프로퍼티로 사용된다. 이 값을 명시하지 않은 경우 기본 에러 메시지가 사용된다. message가 에러 객체인 경우 AssertionError
를 대체해 사용된다.//utils.js 사용할 함수를 저장한 모듈
function capitalize(str) {
return str.charAt(0).toUpperCase() + str.slice(1);
}
function add(num1, num2) {
return num1+num2;
}
module.exports = {
capitalize,
add
}
//utils.spec.js (테스트 코드는 .spec.js로 네이밍)
const utils = require("./utils");
const assert = require("assert");
describe("utils.js 모듈의 capitalize 함수는", function () {
it("문자열의 첫번째 문자를 대문자로 변환한다.", function () {
const result = utils.capitalize("hello");
assert.equal(result, "Hello");
});
});
describe("utils.js 모듈의 add 함수는", function (){
it("두 값을 더한다.", function (){
const result = utils.add(10, 20);
assert.equal(result, 30);
});
});
#2 서드파티 모듈 should를 사용해서 테스트 코드를 작성해보자
npm i mocha --save-dev
로 설치하기assert
모듈을 가져와서 사용했던 것과 다르게 should
는 여러가지 assertion
함수를 지원하므로 따로 모듈을 불러오지 않아도 된다.const should = require("should");
describe("utils.js 모듈의 capitalize 함수는", function () {
it("문자열의 첫번째 문자를 대문자로 변환한다.", function (){
const result = utils.capitalize("hello");
result.should.be.eqaul("Hello");
});
});
#3 익스프레스 통합 테스트용 라이브러리인 SuperTest를 사용해서 통합 테스트 코드(API 기능 테스트)를 작성해보자
npm i supertest --save-dev
로 설치하기 supertest
모듈을 변수 request
에 저장하고, 생성한 서버 app
을 request
에 인자로 전달한다.const should = require("should");
const request = require("supertest");
const app = require("../../index");
const models = require("../../models");
describe("GET /users", () => {
describe("성공시", () => {
it("유저 객체를 담은 배열을 반환한다", (done) => {
request(app).get("/users").end((err, res) => {
res.body.should.be.instanceOf(Array);
done();
});
});
});
})