[Spring Boot] 테스트 주도 개발(TDD)
KUKJIN LEE • 4일 전 작성
테스트 주도 개발(TDD, Test-Driven Development)은 코드를 작성하기 전에 테스트를 먼저 작성하는 소프트웨어 개발 방법론입니다. TDD는 코드의 품질을 높이고, 유지보수성을 향상시키며, 오류를 미연에 방지하는 효과적인 개발 방식입니다.
TDD란 무엇인가?
TDD는 기능을 개발하기 전에 테스트 코드를 작성하고, 그 테스트를 통과하기 위한 최소한의 코드를 작성하는 개발 방식입니다. 이를 통해 코드를 작성하면서 동시에 코드가 올바르게 동작하는지를 검증할 수 있으며, 리팩토링 과정에서도 테스트를 통해 코드의 안정성을 유지할 수 있습니다.
-
테스트 작성: 아직 구현되지 않은 기능에 대한 테스트 코드를 작성합니다.
-
테스트 통과를 위한 코드 작성: 테스트가 통과할 수 있도록 최소한의 코드를 작성합니다.
-
리팩토링: 코드의 품질을 개선하면서 테스트가 계속 통과하는지 확인합니다.
Spring Boot에서의 TDD 적용
Spring Boot에서는 JUnit과 Mockito를 이용해 TDD를 쉽게 적용할 수 있습니다.
테스트 작성하기
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.Mockito.when;
import static org.mockito.Mockito.mock;
import org.junit.jupiter.api.Test;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.junit.jupiter.MockitoExtension;
import org.junit.jupiter.api.extension.ExtendWith;
@ExtendWith(MockitoExtension.class)
public class UserServiceTest {
@Mock
private UserRepository userRepository;
@InjectMocks
private UserService userService;
@Test
public void testFindUserByUsername() {
User mockUser = new User("john", "doe");
when(userRepository.findByUsername("john")).thenReturn(mockUser);
User user = userService.findUserByUsername("john");
assertEquals("john", user.getFirstName());
}
}
UserService
클래스가 구현되지 않은 상태에서 작성하며, findUserByUsername()
메서드를 검증합니다.
코드 작성하기
테스트를 통과시키기 위해 UserService
클래스와 findUserByUsername()
메서드를 구현합니다.
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserService {
private final UserRepository userRepository;
@Autowired
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}
public User findUserByUsername(String username) {
return userRepository.findByUsername(username);
}
}
UserService
작성 후 테스트를 실행하면 통과하게 됩니다.
리팩토링
코드가 테스트를 통과한 후, 리팩토링을 통해 코드의 품질을 개선합니다. 예를 들어, 예외 처리를 추가하거나, 가독성을 높이기 위해 메서드나 변수명을 수정할 수 있습니다.
TDD 작성 시 고려사항
-
작은 단위로 개발: 테스트는 가능한 한 작은 기능 단위로 작성해야 하며, 이를 통해 문제 발생 시 원인을 쉽게 파악할 수 있습니다.
-
자주 테스트 실행: TDD의 핵심은 빠른 피드백입니다. 테스트를 자주 실행하여 코드 작성 과정에서 발생할 수 있는 오류를 조기에 발견해야 합니다.
-
테스트 커버리지: TDD를 통해 작성된 테스트는 코드의 대부분을 커버해야 합니다. 이를 통해 리팩토링 시 코드의 변경으로 인한 문제를 방지할 수 있습니다.
(TDD는 방법론입니다. 코드 작성 후 테스트 코드를 작성할까? 테스트 코드를 작성하고 코드를 작성할까? 무엇이 정답이다. 확실하게 말할 수 없습니다.)
TDD는 초기 개발 속도는 느릴 수 있지만, 장기적으로는 코드의 품질과 유지보수성을 크게 향상시키는 방법론입니다. 테스트는 안정적이고 신뢰할 수 있는 소프트웨어를 개발하는 데 큰 도움이 됩니다.