[TDD] 무엇을 테스트할 것인가? 어떻게 테스트할 것인가?Programming2025. 3. 16. 22:22
Table of Contents
좋은 테스트 코드란 무엇일까에 대한 고민을 하던 중 권용근님의 "무엇을 테스트할 것인가? 어떻게 테스트할 것인가?" 라는 영상을 보게 되었다. 이 영상에서는 테스트 코드를 작성하는 목적과 방법에 대해 말한다. 이번 포스트에서는 영상의 내용을 정리하고, 어떻게 하면 좋은 테스트를 작성할 수 있는지에 대해 이야기해보려고 한다.
1. 테스트로 얻을 수 있는 것
테스트 코드를 작성하는 목적은 현재와 미래의 나, 그리고 동료에게 안정감과 자신감을 주는 것이다.
2. 무엇을 테스트할 것인가?
구현이 아닌 설계를 테스트
테스트 코드를 작성할 때 구현이 아닌 설계를 테스트해야 한다. 아래는 로또 번호를 생성하는 기능을 구현한 코드와 이를 테스트하는 코드이다.
// 요구사항: 중복되지 않은 임의의 숫자 6개를 반환해야 한다.
// 예제
public class LottoNumbersGenerator {
private static final int LOTTO_TICKET_LIMIT_NUM = 6;
private final LottoNumberCollection collection;
public LottoNumbersGenerator(LottoNumberCollection collection) {
this.collection = collection;
}
public List<Integer> generateTicket() {
// 1. 빈 Set을 만든다.
Set<Integer> ticket = new HashSet<>();
// 2. 전체 숫자를 생성한다.
List<Integer> lottoNumbers = collection.createNumbers();
// 3. 숫자를 섞는다.
shuffleNum(lottoNumbers);
// 4. 숫자가 6개가 될 때까지 추가한다.
for(int i = 0; ticket.size() < LOTTO_TICKET_LIMIT_NUM; i++) {
ticket.add(lottoNumbers.get(i));
}
return new ArrayList<>(ticket);
}
private void shuffleNum(List<Integer> lottoNumbers) {
Collections.shuffle(lottoNumbers);
}
}
// 테스트
public class LottoNumbersGeneratorTest {
@Test
@DisplayName("6개의 숫자를 반환")
void generateTicket() {
LottoNumbersGenerator generator = new LottoNumbersGenerator(new LottoNumberCollection());
List<Integer> ticket = generator.generateTicket();
assertThat(ticket.size()).isEqualTo(6);
}
}
위 테스트 코드에는 몇가지 문제가 있다.
- 중복되는 숫자가 없는지 테스트하지 않았다.
- 로또 번호는 중복 없이 6개의 숫자를 반환해야 한다.
- 하지만 위 테스트는 단순히 6개의 숫자가 반환되는지만 확인하고 있다.
- '중복되지 않은 숫자를 반환해야 한다.'라는 비지니스 요구사항을 검증하는 테스트 코드가 없다.
- 구현 방식에 의존하고 있다.
- generateTicket()은 Set을 통해 중복을 자동으로 방지한다.
- 만약 내부 구현이 Set에서 List로 변경된다면 중복을 허용하는 버그가 발생할 것이다.
테스트 가능한 것과 불가능한 것을 구분
'Programming' 카테고리의 다른 글
| [CI/CD] 소프트웨어 배포 전략 (0) | 2025.03.13 |
|---|---|
| [Redis Distributed Lock] Redisson의 Distributed Lock & Synchronizers (1) | 2025.03.09 |
| [동시성 문제 해결하기] 1. 동시성 문제와 기본 개념 (1) | 2025.03.07 |
@중센세 :: 아마코딩
아마추어 개발자의 성장 기록
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!