작년 겨울, 처음 만난 TDD는 나에게 정말 새로운 경험이었다.
어쩌면 이 글을 읽는 누군가는 TDD를 이 글로 인해 처음 알게 될 수도 있을 것이다.
TDD / BDD / DDD
위 세가지에 관해 정리한 글은 여기에 있다.
개발자라면 어디선가 한번 쯤은 들어봤을 용어들.
그치만 생각보다 테스트 코드를 도입하지 않은 회사가 많다. (일단 현재 회사)
여기저기서 이렇게 많이 떠들고 강조하는 걸 보니 중요한거같은데!
"당장 쓰든, 안 쓰든 지대넓얇(지적인 대화를 위한 넓고 얕은 지식)을 쌓아보자!" 가 이 글의 취지이다.
이전에 썼던 개념들도 정리하고, TDD도입의 사례를 보며 'TDD도입이 정말 좋은 선택인걸까?' 에 대해 함께 고민하는 시간을 가졌으면 좋겠다.
TDD(Test Driven Development) : 테스트 주도 개발
반복 테스트를 이용한 소프트웨어 방법론으로, 작은 단위의 테스트케이스를 작성하고 이를 통과하는 코드를 추가하는 단계를 반복하여 구현한다.
개발 시작하기 전에 테스트 케이스를 먼저 작성하고, 이 테스트 케이스를 통과하는 코드를 작성하는 방법론이다.
말 그대로 우리는 그동안 기능에 대한 구현 > 테스트 코드 작성해서 잘 되는지 확인!
이었다면 TDD는
기능에 대해 뼈대를 만들고 테스트를 통과하면 실제 코드에 작성 > 조금 더 작은 단위의 테스트코드 작성 > 통과하면 실제 코드에 적용 의 과정을 반복하는 것이다.
위 과정을 반복하며 코드 품질과 안정성을 보장하는 방식이다.
// 1️⃣ 실패하는 테스트 작성
@Test
void addNumbers_shouldReturnSum() {
Calculator calculator = new Calculator();
assertEquals(5, calculator.add(2, 3)); // ❌ Calculator 클래스가 없으므로 컴파일 에러
}
// 2️⃣ 최소한의 코드 작성 (클래스만 생성, 메서드 구현 X)
public class Calculator {}
// 3️⃣ 실패하는 테스트 (메서드가 없어서 컴파일 에러는 해결되지만 여전히 실패)
public class Calculator {
public int add(int a, int b) {
return 0; // 임시로 0 반환 -> 실패 유지
}
}
// 4️⃣ 테스트를 통과하도록 최소한의 코드 작성
public class Calculator {
public int add(int a, int b) {
return a + b; // ✅ 이제 테스트 통과!
}
}
이전에 Testable한 코드에 대해 작성한 글이 있다.
요약하면,
Testable 한 코드라고 할 수 있다. 이렇게 좋은 점만 나열해놨는데, TDD의 단점은 없는걸까?
💡 해결책:
- 모든 기능을 TDD로 개발할 필요는 없다. 중요한 핵심 로직이나 복잡한 비즈니스에 우선 적용한다.
- 익숙해지면 개발 속도가 점점 빨라진다는 점을 고려해야한다.
💡 해결책:
- 지나치게 세부적인 테스트 보다는 핵심 로직을 검증하는 테스트 집중하기.
- 테스트가 지나치게 구체적이면 유지보수가 어렵기 때문에 적절한 추상화 필요.
💡 해결책 :
- 통합 테스트와 병행하여 중요한 핵심 로직만 TDD로 관리하기.
- Mocking과 실제 테스트 데이터를 적절히 조합해서 테스트하기.
그럼 어디에 TDD를 도입 했을 때 도움이 되는걸까?
결제 시스템, 인증 시스템, API개발 등 실무에서 주요 비즈니스 로직에 적용될 수 있다.
특정 금융 서비스 회사는 TDD를 도입하여 개발 프로세스를 개선하고, 결함률을 크게 줄였다.
이 회사는 TDD를 통해 개발 초기 단계에서 오류를 발견하고 수정하여 전체적인 프로젝트의 지연을 방지하고, 고객만족도를 향상시켰다.
많은 오픈 소스 프로젝트들은 TDD방법론을 채택하여 개발 과정에서의 품질을 보장한다.
왜냐하면 TDD는 개발 과정에서 발생할 수 있는 오류를 사전에 예방하고, 유지보수가 용이한 코드를 작성할 수 있게 해주기 때문이다.
TDD 말만 많이 들어보고 실제 비즈니스에 적용해본 적이 없어서 '꼭 써야해? TDD 안써도 잘 돌아가지않나?' 라고 막연하게 생각했다.
많은 기업에서 안정적인 시스템을 강조하는 만큼 안정적인 비즈니스 로직을 구축하려면, 그리고 좋은 개발 문화를 갖기 위해서 도입하는게 여러모로 장점이 많은 것 같다.
TDD(Test-Driven Development)의 이해와 실제 적용 사례
올리브영 테크블로그 : W CARE 서비스 프론트엔드를 TDD로 개발해본 후기
카카오 페이 테크블로그 : 실전에서 TDD하기
안녕하세요 dev_nana 님!
말씀하신것 처럼 TDD의 장점으로
"코드가 모듈화되고, 단일 책임 원칙(SRP)이 적용되기 쉽다." 에 동의해요🙆♀️
보통 레거시 코드중에 테스트 하기 힘든 코드들이
단일 책임 원칙을 지키지 않아서 많이 힘들었던 기억이 있어요🥲
그리고 테스트 하기 쉬운 코드에 대한 다른 게시글도 있어
Testable에 대한 고민할 수 있는 좋은 시간이 되었어요!