테스트를 하느냐 마느냐 그것이 문제로다...

소개



소프트웨어를 개발할 때 항상 중요한 질문이 발생합니다. 내 코드를 테스트해야 합니까? 대부분의 사람들은 코드를 수동으로 테스트하는 것으로 충분하다고 생각하지만 대답은 아마도 '예'일 것입니다. 비밀을 하나 알려드리겠습니다. 그렇지 않습니다! 단위 테스트는 중요하며 6개월 이상 관리할 계획인 모든 프로젝트에는 테스트가 있어야 한다고 생각합니다.

단위 테스트



혜택



단위 테스트에는 많은 이점이 있습니다. 예를 들어 코드가 모든 에지 케이스에 대해 예상대로 응답한다는 것을 알고 프로젝트를 프로덕션에 보다 자신 있게 배포할 수 있습니다. 또한 단위 테스트는 프로덕션이 아닌 프로세스 초기에 버그를 찾는 데 도움이 될 수 있습니다.

좋아요, 하지만 어떻게 이루어지나요?



일반적으로 코드의 개별 구성 요소를 테스트하려고 합니다. 예를 들어 Java 앱이 있고 서비스 중 하나를 테스트하도록 선택합니다(예: OrderImplService ). 아마도 클래스의 모든 공용 메서드에 대한 단위 테스트를 작성하고 모든 엣지 케이스를 테스트할 것입니다. 예를 살펴보겠습니다.

서비스 구현에 다음 메서드가 있다고 가정합니다.

@Override
public void changeOrderStatus(OrderStatus status, Long oid) {
      OrderEntity order = orderRepository.findOrderByOrderId(oid)
            .orElseThrow(() -> OrderNotFoundException.notFoundById(oid))
      order.setStatus(status);
      orderRepository.save(order);
  }


이 메서드는 제공된 주문 ID가 있는 주문의 주문 상태를 변경합니다. 하지만 어떻게 테스트합니까? 그럼 우리는 서비스에 대한 테스트 클래스를 만듭니다OrderServiceImplTest.java.

public class OrderSerivceImplTest {

   @Test 
   public void yourFirstTest(){

   }
}


이제 우리 서비스는 여러 클래스에 의존하지만 테스트 중인 메서드의 클래스에만 관심이 있습니다. 그래서 우리에게 정말로 필요한 것은 OrderRepository입니다. 그러나 데이터베이스가 없는 경우 리포지토리는 어떻게 응답할까요? 우리는 단지 테스트 중이기 때문입니다. 이를 위해 모의 객체를 사용합니다. 기본적으로 저장소를 모의 처리하고 무엇을 해야 하는지, 반환할지 등을 알려줍니다. 이를 위해 Mockito라는 라이브러리를 사용할 것입니다.
거기에 다음을 추가해 봅시다.


@RunWith(MockitoJUnitRunner.class)
public class OrderSerivceImplTest {

   @Mock
   private OrderRepository orderRepository;

   @InjectMocks
   private OrderService orderService;

   @Test 
   public void yourFirstTest(){

   }
}


이제 우리는 리포지토리를 조롱하고 서비스에 주입했습니다. 이제 메서드에 대한 테스트를 만들고 적절한 이름을 지정해 보겠습니다. 테스트 이름을 다음과 같이 지정하고 싶습니다. givenSomething_expectOutcome()또한 ID로 주문을 받으려고 할 때 무엇을 해야 하는지 저장소에 알려야 합니다. 구현해 보겠습니다.

import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.junit.MockitoJUnitRunner;
import path.to.order.repository.OrderRepository;

@RunWith(MockitoJUnitRunner.class)
public class OrderSerivceImplTest {

   @Mock
   private OrderRepository orderRepository;

   @InjectMocks
   private OrderService orderService;

   @Test 
   public void givenOrderIdAndStatus_expectChangeStatus(){     
      OrderEntity order = getOrderEntity(); 
      when(orderRepository.findOrderByOrderId(anyLong()).thenReturn(Optional.of(getOrderEntity));
      orderService.changeOrderStatus(OrderStatus.PROCCESING, "orderId")
      assertEquals(OrderStatus.PROCCESING, order.getStatus());
      verify(orderRepository).save(order);
   }

   private OrderEntity getOrderEntity(){
    .....
   }
}



그런 다음 주문 저장소가 빈 옵션을 반환하는 경우에 대한 테스트를 만들어야 합니다. 이를 위해 @Test(expected=OrderNotFoundException.class)를 추가한 다음 리포지토리가 빈 옵션을 반환하도록 한 다음 어설션을 삭제하고 확인해야 합니다.

테스트는 매우 중요하며 지금 바로 프로젝트에 구현을 시작해야 합니다!!

좋은 웹페이지 즐겨찾기