TDD(Test-Driven Development, 테스트 주도 개발)는 소프트웨어 개발 방법론 중 하나로, 매우 짧은 개발 사이클의 반복에 의존하는 개발 프로세스.
이 방법론의 핵심은 실제 코드를 작성하기 전에 테스트 케이스를 먼저 작성하는것.
- 실패하는 테스트 작성(Red)
- 테스트를 통과하는 코드작성(Green)
- 코드 리팩토링(Refactor)
이 세단계를 빠르게 반복하면서 개발진행
1. 실패하는 테스트 작성
//TextField.tsx
export default function TextField() {
return <input type='text' />;
}
//TextField.test.tsx
it('기본 placeholder "텍스트를 입력해 주세요."가 노출된다.', async () => {
await render(<TextField />);
const textInput = screen.getByPlaceholderText('텍스트를 입력해 주세요.');
expect(textInput).toBeInTheDocument();
});
placeholder 값이 없기 때문에 테스트 실패

2. 테스트를 통과하는 코드작성
//TextField.test.tsx
export default function TextField() {
return <input type='text' placeholder='텍스트를 입력해 주세요.' />;
}

3. 리팩토링
위의 컴포넌트에서는 리팩토링할거리가 없지만 복잡한 컴포넌트의 경우 테스트로 작성된 원칙을 위배하지 않으면서 코드 수정이 가능해진다.
BDD는 행동주도 개발이라 불리는 TDD에서 파생된 소프트웨어 개발 방법론중 하나. 소프트웨어 개발과 관련된 모든 사람들이 이해할수 있는 명확한 이해와 커뮤니케이션을 통해 개발의 효율성과 품질을 높이는것을 목표로함
BDD는 기술적인 관점보다는 비지니스 요구사항에 초점을 맞추며, 소프트웨어가 어떻게 행동해야하는지에 대한 시나리오를 작성하여 개발
// Calc.spec.js
// 파일이름을 Calc.test.js 대신 Calc.spec.js 로 짓습니다.
describe('Calc', () => {
// 사용자 시나리오 중심으로 작성합니다.
it('첫번째 인자와 두번째 인자의 합 연산을 합니다.', () => {
// given / when / then 을 명확히 합니다.
const useCases = [ { arg: [1, 2] } ];
const results = [3];
for (let i = 0; i < useCases.length; i++) {
const useCase = useCases[i];
const result = Calc().sum(...useCase.arg);
// 사용자 중심의 인터페이스로 assertion을 진행할 수 있습니다.
expect(result).to.equal(results[i]);
}
});
...
});
spect js vs test js
둘다 기능상으론 동일함. spec의 경우 BDD스타일에서 많이 사용되며, 이 컴포넌트가 이렇게 동작해야 한다에 초첨. TDD에서는 이 코드가 통과하는지 테스트할다에 초점
| 검증 범위 | 도입 시점 | 실행 시간 | TDD 적용 | |
| 단위 테스트 | 독립적인 모듈 단위 | 개발 단계 | 매우 짧음 | 가능 |
| 통합 테스트 | 일부 모듈이 조합 되었을 때의 비즈니스 로직 | 개발 단계 | 짧음 또는 보통 | 가능 |
| 시각적 회귀 테스트 | 컴포넌트의 UI | 개발 및 기능 검증이 완료된 상태 | 매우 오래 걸림 | 불가능 |
| E2E 테스트 | 앱의 전반적인 워크 플로우 | 개발 완료 상태(QA 직전 상태) | 매우 오래 걸림 | 불가능 |