Easily change static payload data dynamically using TestNG Data provider

Dahun Yoo·2020년 12월 29일
0
post-thumbnail

API테스트를 할 경우에, 특히 POST로 보내는 body의 데이터에서, 전체적인 attribute등의 json file format의 변화는 없지만, 값을 변경하여 테스트를 해야하는 경우가 많이 있습니다.

{
  name:"Testing API",
  isbn: 1231231,
  aisle:"fafasd",
  author:"John foe"
}

예를 들어 위와 같은 payload를 보내야한다고 가정을 해봅시다. 이 때, isbnaisle 값을 테스트 실행시, 반복해가며 다른 값을 넣어줘야 한다면 어떻게해야할까요?

당장 코드에서 반복문을 돌려가며 다른 값을 넣어주는 방법도 있을 수 있겠고, Excel이나 properties 파일에서 읽어오는 것도 방법일 수도 있겠습니다.
저는 여기서 TestNGDataprovider 를 이용한 방법을 기술하고자합니다.


Payload

일단 준비되어야할 Payload입니다.

public static String bookData(String isbn, String aisle) {
    return "{\n" +
            "\"name\":\"Testing API\", "+
            "\"isbn\":\"" + isbn +"\",\n" +
            "\"aisle\":\""+ aisle +"\",\n" +
            "\"author\":\"John foe\"" +
            "\n}";
}

하나의 format을 그대로 return하되, isbnaisle 부분만 입력받은 파라미터를 그대로 넣어주는 방식을 하고 있습니다.

DataProvider

그 다음은 DataProvider입니다.

//delete book
@DataProvider(name = "BooksData")
public Object[][] getData() {

    return new Object[][]{
        {"Test1", "9321"},
        {"Test2", "2213"},
        {"Test3", "323"}

    };

}

@DataProviderTestNG에서 지원하는 annotation입니다. annotation의 파라미터 name에 임의의 이름을 지정해주세요.
위 예시로는 isbnaisle 이라는 두개의 파라미터가 필요하므로, 2개의 element를 가진 배열 3개를 선언하여 return하고 있습니다.

Testcode

다음은 위 DataProvider를 사용하는 테스트 코드입니다.

@Test(dataProvider = "BooksData")
public void addBook(String isbn, String aisle) {
    RestAssured.baseURI = "{TestURI}";
    String response = given().log().all()
            .header("Content-Type", "application/json")
            .body(
            	Payload.addBook(isbn,aisle)
                )
    .when().post("/Library/Addbook.php")
    .then().log().all()
            .statusCode(200)
            .extract().response().asString();

    JsonPath jp = new JsonPath(response);
    Assert.assertEquals(jp.get("Msg"), "successfully added");
}

자, 위와같이 @Test(dataProvider = "{name}" 으로 annotation을 선언해주면, TestNG가 자동으로 해당 지덩된 DataProvider를 찾아서, 실행시켜주게됩니다.
이때 Testcode는, DataProvider에 선언된 return되는 실제 parameter의 갯수만큼 파라미터를 받을 수 있어야 합니다.

그리고 TestNG는, 리턴되는 전체 배열이 3개가 있으므로, 위 테스트코드를 총 3번 자동으로 반복실행하게됩니다.
DataProvider 내부에서 다시 Excel에서 읽어온다던지 등의 작업을 넣어주면,테스트 코드 자체를 직접적으로 수정하지 않고도 테스트 실행 시 마다 값을 바꾸어줄 수 있을 것입니다.

profile
QA Engineer

0개의 댓글