회고

오늘 미션은 프로그램 테스트 미션으로, Assertion 테스트 모듈 구현해보는 것이었다. 요구 사항에서 비동기 코드에 대한 테스트하는 것이 까다로웠다. 따라서 mocha test framework에서는 비동기 코드를 어떻게 테스트하는지 확인하였다.

describe('Item', function() {
  describe('#purchase()', function() {
    it('should save without error', function(done) {
      var item = new Item('Paper');
      item.save(function(err) {
        if (err) done(err);
        else done();
      });
    });
  });
});

it() 함수에 done() 콜백함수를 더해 비동기 상황에서 기다리거나 완료된 시점을 파악한다. done() 함수는 Error or false 인자를 받아 테스트의 성공/실패 여부를 판별한다.

mocha test framework는 it() 함수 내부에서 done() 콜백함수를 인자로 전달하여 완료된 시점에 성공/실패 여부를 판별하지만, 요구사항에서는 작성된 Target 함수 코드는 수정할 수 없었다.

결과적으로 비동기 함수 호출 시점에는 async/await 이용해 동기적으로 반환값을 받았고, assert 함수를 호출하여 테스트하였다.

test('async test', async function() {
    // given
    const arr = [10, 20];

    // when
    const actual = await appendLazy(arr, 30, 2000);

    // then
    assert.detailEqual(actual, [10, 20, 30]);

});

또한, 미션 요구사항에는 현재까지 진행한 팀원의 미션 프로젝트 중 하나를 선택하여 테스트 코드 작성하는 것도 있었다. 팀원 소스 코드는 최소 단위로 함수 분리가 잘 되어있었기 때문에, Unit Test 코드를 작성하는 데 어려움이 없었다. 팀원의 소스를 보고 테스트를 작성해보며 몇 가지 알 수 있었다.

1. 하나의 목적을 가진 함수는 단위 테스트 작성이 쉽다.
  • 함수가 여러 기능을 제공한다면, 단위 테스트는 하나의 함수에 대해 여러 기능을 테스트 해야 한다.
  • 위 같은 경우, 함수가 하나의 기능만 지원하도록 "함수 분리" 리팩토링을 진행해야 한다.
  • 리팩토링 과정에서도 작은 변경 사항마다 단위 테스트를 작성해야 안전하게 기능을 분리할 수 있다.
  • 결과적으로, 하나의 기능만 지원하는 함수는 단위 테스트가 쉽다.
2. 단위 테스트 통해, 함수가 제공하는 기능을 쉽게 이해할 수 있다.

Learn