저번 포스팅에서는 테스트코드가 왜 필요한지, 어떻게 해야 좋은 테스트코드를 작성하는지에 대해 알아보았다. 그리고 이번에는 기능을 개발하는 방식과 협업에서 좋은 테스트 코드가 무엇인지 알아보도록 하자.
TDD(test-driven development)란, 선 개발 후 테스트 방식이 아닌 선 테스트 후 개발 방식의 프로그래밍 방법이다. 테스트가 기능의 구현을 주도하는 방법이며 이 얘기만 들었을땐, 기능이 없는게 어떻게 테스트를 하죠? 라고 생각할 수 있다. TDD는 아래와 같은 순서로 개발을 진행하게 된다.
TDD는 RED 단계 -> GREEN 단계 -> BLUE 단계를 거쳐 하나의 기능을 구현한다.
1. RED : 실패하는 테스트 작성
먼저, 테스트코드에 검증을 하는 코드를 먼저 작성한다.
@DisplayName("유저 한명을 추가하면 사이트 목록에 유저가 추가된다.")
@Test
void add() {
Site site = new site();
// 구현되지 않은 add
site.add(new developer());
assertThat(site.getUser()).hasSize(1);
assertThat(site.getUser.get(0).getName()).isEqualTo("그릴리쉬");
}
현재 site.add 에는 기능이 개발되지않아 null을 return 한다고 하였을때 해당 테스트는 당연하게 실패할 수 밖에 없다. 즉 기능 구현이 없는 최소한의 기능만 코드를 작성해두고 테스트 코드에서 검증 코드를 구현한다.
2. GREEN : 검증이 통과하게끔 어떤 방식으로든 기능을 구현
site.add가 해당 테스트 코드의 검증을 통과 할 수 있도록 어떻게든 기능을 구현한다.
해당 단계에서는 코드의 가독성이나, 효율성을 따지기 전에 테스트 코드의 검증을 통과하는데 목적을 둔다.
3. BLUE : 검증이 통과하는 선에서 기능을 리팩터링
GREEN 단계에서 구현한 코드는 오로지 검증만을 위해 구현된 코드이기에 코드의 가독성과 효율성이 떨어질 것 이다. 해당 단계에서 테스트코드의 검증이 통과하는 선에서 코드를 리팩터링하여 가독성을 향상시키고 효율성을 높인다.
🤔 TDD가 아닌 선 기능 개발 후 테스트 코드를 작성한다고 가정했을때, 아래와 같은 문제가 생길 수 있다.
💡 TDD 개발 방법을 통한 기능 구현이 가져오는 점
이렇듯, TDD는 관점의 변화를 가져온다. 선 기능 개발 후 테스트 코드를 작성하게 되면 테스트 코드는 기능을 검증하기 위한 보조 수단으로 보이지만, TDD를 통해 테스트와 기능 구현 코드가 함께 개선될 수 있다.
즉, 클라이언트 관점에서 즉각적인 피드백으로 코드를 개발할 수 있다.
우리는 TDD를 적용하는 것은 물론 여러 방식에 대응하여 개발을 할 수 있다. 아래와 같은 개념을 간단하게 살펴보자면
비즈니스에 맞추어 TDD를 적용하고 여러 방법론을 통해 기능을 구현해 나아갈 수 있다. 또한 스크럼을 진행하거나 칸반과 같이 구체적인 프로세스를 갖추어 기능을 구현해 나아갈 수 있다.
다음 포스팅에서는 BDD에 대해 알아보도록 하자 !