단위 테스트

단위(Unit) 테스트란 상태, 메소드, 컴포넌트 등의 정의된 프로그램 최소 단위들이 독립적으로 정상 동작하는지 확인하는 것을 말합니다.이를 통해 프로그램 전체의 신뢰도를 향상하고 코드 리팩토링(Code refactoring)의 부담을 줄일 수 있습니다.

이 글은 TDD(Test Driven Development)를 기준으로 하지 않습니다.

테스트 이해하기

간단한 예제를 통해서 테스트에 대해 이해해 봅시다.다음과 같이 하나의 인수에 **1**을 더한 후 반환하는 addOne 함수를 가진 CommonJS 스타일의 calc.js 모듈이 있습니다.

// calc.js

exports.addOne = function (a) {
  return a + 1
}

이 **addOne**은 숫자 데이터를 인수로 ‘원하는 대로 정상 동작’하길 기대합니다.(여기서 기대하는 정상 동작은 숫자 연산의 결과 반환을 의미하며 매우 주관적인 기준입니다)하지만 다음과 같이 문자 데이터를 인수로 하게 되면 기대하지 않은 결과를 반환합니다.

// main.js

const { addOne } = require('./calc.js')

console.log(
  addOne(1), // 2
  addOne('1') // '11'
)

매번 콘솔 출력을 통해 기댓값을 하나씩 수동 확인하지 않고, 테스트를 통해서 언제든지 다시 검증할 수 있는 상태를 만들어 봅시다.다음 테스트는 Jest를 기준으로 작성했습니다.테스트 설정 및 동작에 관한 내용은 생략합니다.

// calc.test.js

// 테스트 대상을 테스트 환경으로 가져옵니다.
const { addOne } = require('./calc.js')

// Test 1
test('인수가 숫자인 경우', () => {
  // expect()의 인수 결과가 .toBe()의 인수 값이 되길 기대합니다.
  expect(addOne(1)).toBe(2)
  expect(addOne(7)).toBe(8)
})

// Test 2
test('인수가 문자인 경우', () => {
  expect(addOne('1')).toBe(2)
  expect(addOne('7')).toBe(8)
})

테스트를 동작시키면 다음과 같이 **인수가 문자일 경우**에서 테스트가 실패합니다.

위 테스트를 성공시키기 위해서 addOne 함수를 수정(리팩토링)해 봅시다.다음과 같이 **parseFloat**을 사용해 문자 데이터인 경우 숫자 데이터로 변환되도록 수정합니다.

exports.addOne = function (a) {
  return parseFloat(a) + 1
}

다시 테스트를 실행하면 다음과 같이 테스트가 통과합니다.

이런 과정을 통해서 우리가 작성한 코드의 신뢰도를 향상할 수 있고,새로운 로직을 추가하거나 수정할 때도 테스트 통과를 기준으로 문제 발생의 부담이 줄일 수 있습니다.