" 급변하는 세상을 살아가며 제품을 만들어가는 입장에서 빠른 개발에만 집중하여 일단 만들고 다시 들여다 보기 두려운 제품을 만들어 하루하루 살얼음판을 걸을지, 아니면 초반 스피드는 다소 늦더라도 빠르게 변화에 대응해가며 안정적인 제품을 만들어 갈 것인지."
"선택은 자유다."
by Product Manager 관점에서 바라 본 TDD
기능을 구현한 구현 코드가 아닌 테스트 코드를 먼저 작성합니다.
테스트 코드만 작성된 시점에는 구현 코드가 없으므로 컴파일 오류가 발생합니다. 컴파일 오류 해결하기 위한 최소한의 구현 코드를 작성합니다.
테스트 코드를 실행하면 로직으로 구현된 내용이 없으므로 테스트 코드는 통과하지 못합니다.
테스트 코드가 통과될 때까지 구현하는 것을 반복합니다.
🔑 하지만, 구현에서만 멈추면 TDD를 수행한 것이라고 볼 수 없습니다. 왜냐하면 실패(Fail) — 성공(Success) — 리팩토링(Refactoring)의 흐름을 통해 “동작하는 클린 코드” 를 얻는 것이 TDD의 궁극적인 목표이기 때문입니다.
테스트 통과만을 위해 작성한 구현 코드를 리팩토링 하면서 클린 코드를 만들어갑니다.
마지막으로 테스트 코드를 리펙토링합니다.
요즘 단위테스트는 주로 "Given/When/Then" 패턴으로 작성하는 추세입니다.
Given : 어떤 데이터가 준비되었을 때
When : 어떤 함수를 실행하면
Then : 어떤 결과가 나와야한다.
@Test
@DisplayName("유저 회원가입 테스트")
void userSigninTest() {
// given
// when
// then
}
CowAPI 개인 토이 프로젝트를 진행하며 TDD 방식을 적용해보았습니다.
안정적으로 테스트를 진행하고 구현하기 위해 기능별로 "Domain -> Service -> Controller" 순으로 테스트 코드를 작성하고 구현하여 테스트를 진행했습니다.
처음에는 테스트 코드를 작성하며 개발하는 시간이 많이 걸렸습니다. 하지만, 테스트 코드를 작성하는데 익숙해지기 시작했고 구현한 코드가 원하는 동작을 제대로 하는지 확인할 수 있고 안정적으로 코드를 수정할 수 있다는 장점을 직접 느끼기 시작했습니다.
올바르고 더 좋은 테스트 코드는 어떤 것인가?를 학습하며 수정하고 있습니다.
또한, 반복되는 CRUD 테스트 코드를 어떻게 하면 더 손쉽게 작성하고 실행시킬 수 있을지에 대한 고민중입니다.