테스트 코드

  • 소프트웨어 개발 후 기능과 동작을 테스트하는 데 사용되는 코드이다.
  • 개발자가 예상한대로 프로그램이 실행하는지 확인하는 역할을 한다.
  • 어떤 기능을 테스트할 것인지에 대해 각각 테스트 케이스를 분류하고, 다양한 라이브러리와 프레임워크를 이용해 작성할 수 있다.

테스트 코드의 종류

  1. 단위 테스트 ( Unit Test )
    • 하나의 메서드나 클래스 등 작은 단위를 독립적으로 테스트하는 방법이다.
    • 외부 의존성( DB, 네트워크 등 )은 mock이 처리
    • 예 : 회원가입 시 이메일 형식을 검사하는 함수만 따로 테스트
  2. 통합 테스트 ( Integration Test )
    • 여러 컴포넌트( 예 : controller, Service, Repository )가 함께 동작하는지 확인
    • 실제 데이터베이스나 서버와 연결되는 경우가 많음
    • 예 : 회원가입 요청 -> DB저장까지 전체 흐름 테스트
  3. 엔드 투 엔드 테스트 ( E2E, End-to-End )
    • 사용자 관점에서 전체 시스템을 테스트 (브라우저 자동화 등 포함)
    • UI -> 백앤드 -> DB 등 실제 사용 흐름 전체 검증

그래서 테스트 코드를 사용하는 이유?

  1. 버그 예방 및 조기 발견
    • 개발 중 실수나 논리 오류를 빠르게 발견할 수 있다.
    • 코드가 예상대로 동작하는지 확인할 수 있어, 배포 전에 문제를 줄일 수 있다.
  2. 리팩토링의 안정성 확보
    • 기존 기능을 망가뜨리지 않고 코드를 개선할 수 있다.
    • 테스트 코드가 변경 전/후의 동작을 비교해주는 보호막 역할을 한다.
  3. 자동화된 검증으로 생산성 향상
    • 수동 테스트 대신 자동으로 실행되므로 반복 작업을 줄여준다.
    • CI/DI 파이프라인에서 테스트 자동 실행으로 배포 안정성 확보가 가능하다.
  4. 문서화 역학
    • 테스트 코드를 보면 해당 기능이 어떤 입력과 출력을 갖는지 알 수 있어, 일종의 실행 가능한 명세서 역할을 한다.
  5. 협업과 유지보수에 유리
    • 다른 개발자가 코드를 변경할 때 테스트가 실패하면 영향을 인지할 수 있다.
    • 코드 변경 시 의도치 않은 부작용을 방지할 수 있어 유지보수에 매우 유리하다.
  6. 디자인 품질 향상
    • 테스트 가능한 구조를 만들기 위해 결합도를 낮추고, 의존성을 분리하게 되어 설계 품질이 좋아진다.

테스트 코드 작성 예시

@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는 테스트 코드를 먼저 작성한 후, 해당 테스트를 통과하도록 실제 코드를 구현하는 개발 방식입니다.

  • 순서:
    1. 실패하는 테스트 작성 (Red)
    2. 테스트 통과하는 최소한의 코드 작성 (Green)
    3. 중복 제거, 리팩토링 (Refactor)
  • 이 방식은 설계 품질과 안정성을 동시에 확보할 수 있도록 도와줍니다.