왜 TDD가 중요할까?
소프트웨어 (프로그램)의 거대화
개발해야되는 스코프가 점점 더 많아짐에 따라 유지보수 및 장애 발생시 대처를 유연하게 할 수 있다.
좋은 Test Code
•
요구사항이 바뀌면 TestCode도 실패해야 한다.
TestCode의 종류
크게 3가지로 나눌 수 있다.
1. E2E Testing (End-to-End testing)
•
컨트롤러 단부터 DB까지 전체적인 플로우 테스트
•
애플리케이션이 제공하는 기능을 사용자 시나리오 기반으로
2. Integration Testing
•
간단하게 말하면 DB에 직접 붙어서 하는 테스트
•
서로 다른 module / system 의 상호작용
•
맞물려 돌아가는 기능이 모여 정상적으로 원하는 기능을 제공하는지 점검
3. Unit Testing
•
단위 모듈 테스트
•
단일 기능 혹은 작은 단위의 함수/객체 등을 테스트한다.
•
새로운 기능 혹은 개선이 기존의 rule을 위배하지 않는지 검
Test Double
•
실제 컴포넌트를 대체할 수 있도록 하는 대역
•
실제 컴포넌트에 대해 행동을 모방하고 강한 결합도를 낮춘다.
ex) Mock, Stub
Mock
•
테스트를 위해 특정 기능에 대해 정해진 응답을 제공하는 객체
•
입력과 상관없이 어떤 행동을 할 지에 초점을 맞춘 객체
◦
컨트롤러에 목데이터를 반환하고 컨트롤러에 요청을 하는 식으로 사용
Stub
•
테스트에 필요한 호출에 대해 미리 준비된 응답을 제공하는 객체
it('[Stub Class] 주문이 완료되지 못했다면 에러가 발생한다', () => {
// given
const stubRepository = new class extends OrderRepository {
override findById(id: number): Order | undefined {
return Order.create(1000, LocalDateTime.now(), '');
}
}
const sut = new OrderService(stubRepository);
// when
const actual = () => {
sut.validateCompletedOrder(1)
};
// then
expect(actual).toThrow('아직 완료처리되지 못했습니다.');
});
JavaScript
복사