웹 개발

Postman 테스트? NO! 테스트 코드를 활용하자!

ultramancode 2023. 2. 17. 01:22

0. 왜 굳이 테스트 코드를 써야 할까?

수동 postman 자동 테스트
사람이 눌러야 한다 머신이 대신 눌러 준다
한 번만 재현하면 끝 PR마다 반복
새 기능이 다른 코드 깨져도 모름 깨지면 파이프라인 즉시 실패
 

결국 “테스트 코드 = 내가 없어도 코드를 눌러 줄 Postman” 이다.


1. JUnit: 순수 메서드부터 테스트 하기!

class DiscountServiceTest { 

    @Test 
    void vip_고객은_10퍼센트_할인() { 
    DiscountService svc = new DiscountService(); 
    int price = svc.apply(1000, Grade.VIP); assertEquals(900, price); 
    } 
    
}

Why 이렇게 시작하나?

이유 설명
의존성 0 스프링 컨테이너 없이 새 객체만 만들면 끝
학습 곡선 완만 Mockito · MockMvc 같은 툴을 몰라도 바로 실행
실패 지점 명확 비즈니스 로직 한눈에 파악 → 디버깅이 쉽다
 

만약 서비스 로직을 순수 자바로 먼저 설계해 두면, 컨테이너를 띄우지 않아도 대부분의 로직을 검증할 수 있다.

 

2. 통합 테스트

앞에서 스프링 없이도 되는 걸 확인했다면, 이번엔 진짜 빈 주입 + DB 트랜잭션까지 시험해 보자

given when then 주석을 통해 구분해가며 하니까 확실히 편했다(인프런 김영한 강사님 강의를 보고 배웠다..ㅎㅎ)

@SpringBootTest
@Transactional
class OrderServiceIntegrationTest {

    @Autowired OrderService orderService;
    @Autowired OrderRepository orderRepository;

    @Test
    void 주문_생성_정상_동작() {
        // given
        OrderDto dto = new OrderDto(1L, List.of(3L, 4L));

        // when
        Long orderId = orderService.placeOrder(dto);

        // then
        Order saved = orderRepository.findById(orderId).orElseThrow();
        assertEquals(OrderStatus.PLACED, saved.getStatus());
    }
}
  • @SpringBootTest : 실제 스프링 컨테이너 기동
  • @Transactional : 테스트 후 롤백 → DB 깨끗

3. 후기

뭔가 테스트 코드라는 이름에 겁 먹었는데 시나리오를 짜는 느낌이라 신선하고 재밌었다.

물론 비즈니스 요구 사항을 구현하면서 이렇게 테스트 코드까지 생각하고 짜게 된다면 로직을 짜는데 소요되는 개발 시간이 꽤 늘어날 것 같아서 약간의 트레이드 오프는 있을 것 같다.

하지만 이를 통해서 휴먼 에러를 방지할 수 있다면 그 정도 시간 소요는 감수할만하지 않을까 하는 생각을 조심스레 해본다..!