Test-Driven-Development(TDD) 테스트 주도 개발은 테스트 코드를 작성하고 테스트 통과 코드를 구현하고 리팩터링 하는 과정을 통해 개발을 진행하는 방법론이다.
- 버그 발생 가능성 낮추는 효과
테스트 코드를 먼저 작성하고 실제 코드를 작성하기 때문에 테스트 되지 않는 코드는 실제 코드에 적용될 수 없다. 즉, 프로그램에서 모든 코드가 테스트되기 때문에 버그의 발생 가능성이 줄어든다.
- 요구사항을 명확히 드러내는 효과
테스트 자체가 요구사항을 분명하게 드러내는 효과가 있어 테스트에 맞게 코딩하다보면 자연스레 프로그램의 디자인이 SimpleDesign이 되는 경향이 있다.
- 개발의 유연성을 높이는 효과
테스트가 잘 작성되어 있으면 프로그램에 여러 가지 변경 작업을 할 때, 변경으로 인해 다른 부분에서 예상치 못한 문제가 발생하는 것을 쉽게 알아차릴 수 있어 변경 작업을 두려움 없이 할 수 있게 되어 최종적으로 생산성 향상에 기여한다.
TDD의 특징은 구현보다 테스트 코드를 먼저 작성하여 인터페이스와 스펙을 먼저 정의한다는 것이 특징이다.
- Red → 실패하는 테스트 코드를 작성. 인터페이스와 스펙에 집중한다.
- Green → 최대한 빨리 테스트 코드를 통과하는 코드 구현한다. 올바른 방법이 아니어도 괜찮다. ex) 하드코딩
- Refactor → 리팩터링을 통해 코드를 올바르게 개선한다. TDD에서 가장 중요한 부분이다. ⭐️
위 사이클을 반복하며 연습하여 익숙해져야 TDD를 올바르게 사용할 수 있고 클린코드도 작성할 수 있게된다.
작은 단계를 찾고 코드에서 피드백을 얻는 것이 어렵고 중요하다. 2번이 어렵다면, 1번으로 돌아가서 더 작고 쉬운 문제를 정의하고 3번을 위해 의도를 드러내고 중복을 찾아 제거하는 연습을 해야한다.
Jest
라는 테스트 라이브러리를 사용하여 단위테스트를 할 수 있고, React-Testing-Library
를 사용하여 E2E 테스트를 진행할 수 있다.
아래는 Jest 라이브러리를 사용하여 Describe-Context-It
패턴으로 테스트 코드를 작성한 예시이다.
function add(x: number, y: number): number {
return x + y;
}
const context = describe;
describe('add 함수', () => {
context('두 개의 양수가 주어졌을 때,', () => {
it('항상 두 개의 숫자보다 큰 값을 돌려준다.', () => {
expect(add(1, 2)).toBeGreaterThan(1);
expect(add(1, 2)).toBeGreaterThan(2);
});
});
context('하나의 양수와 음수가 주어졌을 때,', () => {
it('항상 하나의 양수보다 작은 값을 돌려준다.', () => {
expect(add(1, -1)).toBeLessThan(1);
expect(add(1, -2)).toBeLessThan(1);
});
});
});