Specification Re-use in Rest-Assured with ResponseSpecBuilder and RequestSpecBuilder
Rest-Assured로 여러분의 API에서 테스트를 작성할 때마다 확인해야 할 공통된 expected results가 있을 수 있습니다. API Call마다 매번 체크해야할 expected results 같은 것들 말이죠.
아래 간단한 테스트를 한번 예를 들어 보겠습니다.
@Test public void testSomeApi() { when(). get("http://yourWebsiteAddress.com/someAPIcall"). then(). statusCode(200). body(containsString("Your Website Title")); }
이 테스트는 http://yourWebsiteAddress.com 의 someAPIcall을 호출 하는 것입니다.
그리고 나서 HTTP response의 status code가 200 임을 확인하고 (OK response) response의 body에 “Your Website Title“ 라는 string을 포함하는 지의 여부를 체크 하는 것입니다.
여러분의 웹사이트에 대해 아주 많은 API call을 테스트 해야 된다고 가정해 봅시다.
아마도 모든 API 호출이 200의 상태 코드를 반환하고 'Your Website Title'문자열이 모든 호출 본문에 존재하는지 테스트하는 것이 합리적 일 것입니다. 매번 테스트에 이것을 사용하는 대신, 다음과 같이 @BeforeClass 어노테이션 된 메소드에서 테스트 클래스의 맨 위에 ResponseSpecBuilder를 지정할 수 있습니다.
import com.jayway.restassured.builder.ResponseSpecBuilder; import com.jayway.restassured.specification.ResponseSpecification; import org.junit.BeforeClass; import static org.hamcrest.Matchers.containsString; public class ResponseSpecTest { public static ResponseSpecBuilder builder; public static ResponseSpecification responseSpec; @BeforeClass public static void setupResponseSpecBuilder() { builder = new ResponseSpecBuilder(); builder.expectStatusCode(200); builder.expectBody(containsString("Your Website Title")); responseSpec = builder.build(); } }
이제 여러분은 testSomeApi()를 아래와 같이 재작성 하실 수 있습니다.
@Test public void testSomeApi() { when(). get("http://yourWebsiteAddress.com/someAPIcall"). then(). spec(responseSpec); }
이렇게 간단히 request 의 then() 부분에 spec(responseSpec) 만 호출하면 됩니다. 그러면 status code 200을 확인하고 response의 body에 해당 string이 있는지 확인 하게 됩니다.
그리고 다른 테스트에서도 이 request data를 재사용하고 싶다면 이와 비슷하게 하기만 하면 됩니다.
아래 테스트에서 API에 POST 요청을 할 때 헤더에 인증 코드를 지정하고 로그인 ID 매개 변수를 지정합니다.
@Test public void testAnApiPostCall() { given(). header("Authorization", "abcd-1234-xyz"). param("loginID", "joebloggs"). when(). post("http://yourWebsiteAddress.com/somePostAPI"). then(). body("result.message", equalTo("success")); }
테스트에서 POST 호출을 할 때마다 항상 헤더에 권한 코드를 지정하고 매개 변수로 loginID를 지정해야한다고 가정합니다. 아래 예제와 같이 테스트 코드의 시작 부분에 RequestSpecBuilder를 지정할 수 있습니다.
import com.jayway.restassured.builder.RequestSpecBuilder; import com.jayway.restassured.specification.RequestSpecification; import org.junit.BeforeClass; public class RequestSpecTest { public static RequestSpecBuilder builder; public static RequestSpecification requestSpec; @BeforeClass public static void setupRequestSpecBuilder() { builder = new RequestSpecBuilder(); builder.addHeader("Authorization", "abcd-123-xyz"); builder.addParameter("loginID", "joebloggs"); requestSpec = builder.build(); } }
이제 아래와 같이 원래의 testAnApiPostCall () 테스트를 다시 작성할 수 있으며, 인증 헤더와 loginID 매개 변수를 필요로하는 모든 API 호출에서 requestSpec을 재사용 할 수 있습니다.
@Test public void testAnApiPostCall() { given(). spec(requestSpec). when(). post("http://yourWebsiteAddress.com/somePostAPI"). then(). body("result.message", equalTo("success")); }
이 예제가 유용하게 사용되기를 바랍니다. 이 기능은 테스트 할 여러 가지 API가 많지만 모두 공통된 결과를 산출하는 경우에 특히 유용합니다. 최소한 모든 API 호출이 응답 코드 200을 리턴하는지 확인하기위한 점검을 추가하는 것이 유용합니다.
'TDD Project > Rest Assured' 카테고리의 다른 글
[Hamcrest] The Hamcrest Tutorial (0) | 2017.05.19 |
---|---|
[REST-assured] REST-assured Tutorial (0) | 2017.05.05 |
[Hamcrest] Using Hamcrest for testing (0) | 2017.04.26 |