REST 웹 서비스를 어떻게 단위 테스트 할 수 있습니까?


16

단위 테스트를 처음 접했을 때 DB를 호출하고 DTO를 채우는 REST 웹 메소드가 하나 있습니다. 의사 코드는

public object GetCustomer(int id)
{
  CustomerDTO objCust = //get from DB
  return objCust;
}

이러한 방법과 테스트 유형 (통합 / 단위)에 대한 테스트를 작성하는 방법은 의심의 여지가 있습니다. 그리고 단위 테스트를 위해서는 DB를 쳐야합니다. 고객 ID를 전달하고 어설 션을 거의 수행하지 않으면 결국 데이터가 변경되어 오류가 발생할 수 있습니다.

이 개념을 이해하고있는 부분이 빠진 것 같습니다.


5
게시 한 코드에서 테스트 할 사항은 다음과 같습니다. (1) 매개 변수로 int를 사용하여 GetCustomer를 호출 할 수 있습니까? (2) CustomerDTO 객체를 반환합니까? (3) 해당 개체가 예상대로 DB에서 채워 졌습니까? (4) 유효한 고객과 일치하지 않는 int로 호출하면 예상되는 동작이 발생합니까? 아직 REST와 관련이 없습니다. RESTful 요청에 응답하는 코드를 작성할 준비가되면 테스트를 작성합니다.
DavidO

@DavidO : "객체가 예상대로 DB에서 채워져 있습니까?" (OP의 코드와 관련하여) 단위 테스트아닙니다 . 그것은 통합 테스트입니다.
Flater

그래 정확 해. 돌아가서 주석을 변경하여 통합 테스트에서 DB 구성 요소를 확인하고 다른 방법으로 조롱하면 편집 할 수 있지만 5 분이면 주석 편집 창에서 주석을 6 번 만들었습니다. 여러 해 전에. :)
DavidO

답변:


18

단위 테스트 중에는 단위 테스트를 준비하지 않은 데이터베이스가 아닌 데이터베이스를 사용하여 테스트하지 않아도됩니다. 데이터베이스를 사용한 테스트 및 이와 같이 애플리케이션의 여러 계층을 동시에 테스트하는 것은 일반적으로 통합 테스트 로 간주됩니다 . 단위 테스트를 사용하면 메소드가 수행하는 작업, 다른 매개 변수에 따라 반환되는 작업 및 실패 할 때만 테스트해야합니다.

메소드에서 다른 클래스에서 X 메소드를 호출 할 것으로 예상 됩니다. 이러한 X 메소드를 테스트하지 않으므로 이러한 메소드 를 조롱 해야합니다.

Java로 코드를 작성한다고 가정하면 Mockito 와 같은 훌륭한 조롱 프레임 워크 가 도움이 될 수 있습니다. 당신이 조롱 프레임 워크를 사용하든 아니든간에, 나는 그들이 당신을 많은 시간을 절약 할 것이라고 말하고 적어도 내가 언급 한 것은 실제로 복잡하지 않습니다.

실험을 위해 자신의 모의를 작성하려면 다음 CustomerRepository클래스 가 있다고 가정하십시오 .

public class CustomerRepository {
 public CustomerDTO getCustomer(int id) {
   ...
 }
}

CustomerRepository다음과 같은 방법으로 자신의 조롱 및 더러운 수업을 작성할 수 있습니다 .

public class MockedCustomerRepository extends CustomerRepository {
 public boolean bThrowDatabaseException;
 public boolean bReturnNull;
 public boolean bReturnCustomerWrongId;
 public boolean bReturnCustomerWithId;
 public CustomerDTO getCustomer(int id) {
  if(bThrowDatabaseException) { 
    throw new DatabaseException("xxx"); 
  } else if(bReturnNull) { 
    return null; 
  } else if(bReturnCustomerWrongId) { 
    throw new CustomerNotExistException(id);
  } else if(bReturnCustomerWithId) { 
    return new CustomerDTO(id); 
  }
 }
}

그런 다음 테스트 사례에서 기본적으로 "표준"인스턴스 CustomerRepository를 모의 인스턴스로 바꾸면 다음과 같은 다양한 결과에 대해 메소드를 테스트 할 수 있습니다 getCustomer.

public class CustomerRestTest {
  public void testGetCustomer_databaseFailure() {
    MockedCustomerRepository dto = new MockedCustomerRepository();
    dto.bThrowDataBaseException = true;
    yRestClass rest = new MyRestClass();
    rest.dto = dto;
    rest.getCustomer(0);
    // depending on what you do in your getCustomer method, you should check if you catched the exception, or let it pass, etc.. Make your assertions here

  public void testGetCustomer_customerNotExist() {
    // etc.
  }
}

일반적으로 모든 테스트 방법은 한 가지만 테스트해야하므로 테스트를 작게 유지하고 한 작업에 집중할 수 있습니다.

반복하겠습니다 :-) 전체 조롱 된 클래스를 작성하는 데는 시간이 걸립니다. 조롱 프레임 워크를 사용하는 것이 좋습니다. 코드 작성 횟수가 적을수록 오류가 적습니다 . 예외를 던지거나 주어진 매개 변수에 대해 주어진 값을 반환하는 메서드를 조롱하는 것은 케이크 한 조각이며 2 ~ 3 줄을 차지합니다 (최소한 mockito)

REST 메소드 테스트에 도움이되기를 바랍니다.


4
일반적으로 DTO 클래스에는 로직이 없으며 특히 데이터 스토리지와 상호 작용하는 로직이 없습니다.
JustAnotherUserYouMayKnowOrNot 또는

1
그것은 단지 예일 뿐이지 만, 당신은 절대적으로 옳습니다. 이론에 더 잘 맞도록 예제를 변경하겠습니다.
Jalayn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.