본문 바로가기

카테고리 없음

테스트 주도 개발(TDD)

테스트 주도 개발 개론

테스트 주도 개발(TDD : Test Driven Development) : 코드를 작성하기 전에 먼저 테스트를 작성하는 방법론입니다. 개발자 자신이 바람직하다고 생각하는 코드의 결과를 미리 정의 하고, 이것을 바탕으로 코드를 작성하는 방법입니다.

 

장점 : 체계적으로 코드를 작성할 수 있습니다. 코드를 어떻게 구성 하고, 그런 과정에서 버그가 더 적은 코드를 작성할 수 있게 됩니다.

 

단점 : 속도입니다. 프로토타입으로 빠르게 결과물을 보며, 대략적인 뼈대를 잡아 가고 싶어 할 수도 있습니다. 이럴 경우에는 TDD 방법론을 이용하게 된다면, 속도가 느리다고 느껴질 것입니다.

 

제대로된 오픈 소스에서는 테스트 코드가 있지 않은 Pull Request가 들어 왔을 때, 병합을 해주지 않습니다.

 

테스트 주도 개발, 키워드

TDD에서는 describe, it, assert, expect 같은 다양한 키워드를 만나실 수 있을 겁니다.

 

이런 키워드를 보게 되면 자연스레 떠오르는 것은, '이 모든 키워드들은 어디에 사용하지?'

 

결론부터 이야기 하자면, 이 모든 키워드들은 테스트 코드을 작성할 때 필요한 것입니다.

 

코드스테이츠에서는 테스트 프레임워크로는 mocha, chai등을 이용 하고, 그 이외의 프레임워크로는 jest, supertest등 다양한 테스트 프레임워크가 있습니다.

 

유닛 테스트 작성하기 - 작은 기능 검사하기

유닛은 함수의 한 블록을 의미 하는 경우가 많습니다. 정말로 사소한 함수를 제외 하고는, 모든 함수에는 테스트 케이스가 필요합니다. 

 

유닛 테스트의 구성 요소

주장(Assertions)

유닛 테스트는 개발자가 이렇게 생각 하면서 시작 합니다. "이 코드의 결과는 이래야 해!" 

function square(x) {
  return x * x;
}

위의 함수가 있다고 생각 했을 때, 

console.log(square(5) === 25);

직접 Boolean 타입을 리턴하지 않고, console.log()만으로 확인 하기 때문에, 하나의 unchecked assertion이라고 할 수 있습니다.

  • 함수의 인자가 5 일 때, 25 === 25 // true 이기 때문에 true가 출력 됩니다.
  • 함수의 인지가 10 일 때, 100 === 25 // false 이기 때문에 false가 출력 됩니다. 
let output = sqaure(5);
expect(output).to.equal(25);

이 Assertion는 sqaure 함수에 인자가 5가 들어 오면, 결과 값으로 25가 출력 되어야 한다는 것입니다. 만약 sqaure 함수로직에 오류가 있다면 25가 출력되지 않을 것이기 때문에, 테스트가 통과 되지 않을 것입니다.

 

function assertEqual(actual, expected, testName) {
	if (actual === expected) {
    	console.log('Passed');
    } else {
    	console.log(`Failed ${testName}: Expected ${expected}, but got ${actual}`);
    }
}

위와 같이 console.log()을 assert function 내에서도 사용할 수 있습니다.

 

Matcher 

expect(output).to.equal(25);

to.equal을 매쳐라고 부릅니다.