Test Code
테코의 중요성
테스트 코드
- 소프트웨어 개발 후 기능과 동작을 테스트하는 데 사용되는 코드이다.
- 개발자가 예상한대로 프로그램이 실행하는지 확인하는 역할을 한다.
- 어떤 기능을 테스트할 것인지에 대해 각각 테스트 케이스를 분류하고, 다양한 라이브러리와 프레임워크를 이용해 작성할 수 있다.
테스트 코드의 종류
- 단위 테스트 ( Unit Test )
- 하나의 메서드나 클래스 등 작은 단위를 독립적으로 테스트하는 방법이다.
- 외부 의존성( DB, 네트워크 등 )은 mock이 처리
- 예 :
회원가입 시 이메일 형식을 검사하는 함수만 따로 테스트
- 통합 테스트 ( Integration Test )
- 여러 컴포넌트( 예 : controller, Service, Repository )가 함께 동작하는지 확인
- 실제 데이터베이스나 서버와 연결되는 경우가 많음
- 예 :
회원가입 요청 -> DB저장까지전체 흐름 테스트
- 엔드 투 엔드 테스트 ( E2E, End-to-End )
- 사용자 관점에서 전체 시스템을 테스트 (브라우저 자동화 등 포함)
- UI -> 백앤드 -> DB 등 실제 사용 흐름 전체 검증
그래서 테스트 코드를 사용하는 이유?
- 버그 예방 및 조기 발견
- 개발 중 실수나 논리 오류를 빠르게 발견할 수 있다.
- 코드가 예상대로 동작하는지 확인할 수 있어, 배포 전에 문제를 줄일 수 있다.
- 리팩토링의 안정성 확보
- 기존 기능을 망가뜨리지 않고 코드를 개선할 수 있다.
- 테스트 코드가 변경 전/후의 동작을 비교해주는 보호막 역할을 한다.
- 자동화된 검증으로 생산성 향상
- 수동 테스트 대신 자동으로 실행되므로 반복 작업을 줄여준다.
- CI/DI 파이프라인에서 테스트 자동 실행으로 배포 안정성 확보가 가능하다.
- 문서화 역학
- 테스트 코드를 보면 해당 기능이 어떤 입력과 출력을 갖는지 알 수 있어, 일종의 실행 가능한 명세서 역할을 한다.
- 협업과 유지보수에 유리
- 다른 개발자가 코드를 변경할 때 테스트가 실패하면 영향을 인지할 수 있다.
- 코드 변경 시 의도치 않은 부작용을 방지할 수 있어 유지보수에 매우 유리하다.
- 디자인 품질 향상
- 테스트 가능한 구조를 만들기 위해 결합도를 낮추고, 의존성을 분리하게 되어 설계 품질이 좋아진다.
테스트 코드 작성 예시
@SpringBootTest
class UserServiceTest {
@Autowired
private UserService userService;
@Test
void 회원가입_성공() {
// given
UserDto userDto = new UserDto("test@example.com", "password123");
// when
User user = userService.register(userDto);
// then
assertEquals("test@example.com", user.getEmail());
}
}
테스트 코드의 구성 요소
| 구성 요소 | 설명 |
|---|---|
@Test |
해당 메서드가 테스트임을 표시 |
assertEquals(), assertTrue() 등 |
테스트 결과가 기대값과 같은지 검증 |
@BeforeEach, @AfterEach |
각 테스트 실행 전/후 초기화 |
@Mock, @InjectMocks |
외부 의존 객체를 가짜(Mock)로 생성 |
테스트 코드의 장점
| 장점 | 설명 |
|---|---|
| 빠른 피드백 | 코드 변경 후 바로 영향 확인 가능 |
| 리팩토링 안전 | 테스트 코드가 보호막 역할 |
| 협업 용이 | 다른 개발자도 코드의 의도를 쉽게 이해 |
| 유지보수 용이 | 시간이 지나도 기능 보장이 가능 |
테스트 코드 작성 시 유의사항
- 작고 명확한 테스트: 한 번에 하나의 기능만 테스트
- 독립적 테스트: 테스트 간 의존성이 없어야 함
- 실행 시간 고려: 너무 오래 걸리면 테스트를 자주 안 하게 됨
- 실제 데이터 조심: 테스트 DB 또는 Mock 사용 권장
TDD ( Test-Driven Development )
-
TDD는 테스트 코드를 먼저 작성한 후, 해당 테스트를 통과하도록 실제 코드를 구현하는 개발 방식입니다.
- 순서:
- 실패하는 테스트 작성 (Red)
- 테스트 통과하는 최소한의 코드 작성 (Green)
- 중복 제거, 리팩토링 (Refactor)
- 이 방식은 설계 품질과 안정성을 동시에 확보할 수 있도록 도와줍니다.