TDD(1) 시작하기

13292 단어 TDDTDD

테스트 주도 개발 TDD

Test Driven Development
노드에서는 mocha, should, superTest 등의 라이브러리를 사용해서 TDD를 할 수 있다.

Mocha

TDD를 할 수 있는 대표적인 자바스크립트 프레임워크로 테스트코드를 실행하는 테스트 러너(test runner)

  • 설치: npm i mocha --save-dev
  • 테스트 수트: 테스트 환경으로 모카에서는 describe()로 구현한다.
  • 테스트 케이스: 실제 테스트를 말하며 모카에서는 it()으로 구현한다.
  • 테스트 실행: node_modules/.bin/mocha utils.spec.js

#1 노드에서 제공하는 assert 모듈을 사용해서 capitalize와 add 함수가 동작하는지 확인하는 테스트 코드를 작성해보자.

  • assert.equal(actual, expected[, message])
    • == operator로 두 값을 비교하며, 두 값이 모두 NaN인 경우 일치하는 것으로 간주한다.
    • 따라서 assert.strictEqual() 사용을 권장한다.
      • `=== operator'로 두 값을 비교
    • optional한 message 값은 두 값이 일치하지 않을때 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에 저장하고, 생성한 서버 apprequest에 인자로 전달한다.
  • 비동기 요청을 보내는 경우에는 done을 it의 콜백에 전달하고, 테스트 케이스를 마친 후에 done을 실행시키도록 한다.
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();
      });
    });
  });
})

좋은 웹페이지 즐겨찾기