반응형
블로그 이미지
개발자로서 현장에서 일하면서 새로 접하는 기술들이나 알게된 정보 등을 정리하기 위한 블로그입니다. 운 좋게 미국에서 큰 회사들의 프로젝트에서 컬설턴트로 일하고 있어서 새로운 기술들을 접할 기회가 많이 있습니다. 미국의 IT 프로젝트에서 사용되는 툴들에 대해 많은 분들과 정보를 공유하고 싶습니다.
솔웅

최근에 받은 트랙백

글 보관함


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을 리턴하는지 확인하기위한 점검을 추가하는 것이 유용합니다.




반응형

Comment

이전 1 2 3 4 다음