API테스트를 할 경우에, 특히 POST로 보내는 body의 데이터에서, 전체적인 attribute등의 json file format의 변화는 없지만, 값을 변경하여 테스트를 해야하는 경우가 많이 있습니다.
{
name:"Testing API",
isbn: 1231231,
aisle:"fafasd",
author:"John foe"
}
예를 들어 위와 같은 payload를 보내야한다고 가정을 해봅시다. 이 때, isbn
과 aisle
값을 테스트 실행시, 반복해가며 다른 값을 넣어줘야 한다면 어떻게해야할까요?
당장 코드에서 반복문을 돌려가며 다른 값을 넣어주는 방법도 있을 수 있겠고, Excel이나 properties
파일에서 읽어오는 것도 방법일 수도 있겠습니다.
저는 여기서 TestNG
의 Dataprovider
를 이용한 방법을 기술하고자합니다.
일단 준비되어야할 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하되, isbn
과 aisle
부분만 입력받은 파라미터를 그대로 넣어주는 방식을 하고 있습니다.
그 다음은 DataProvider
입니다.
//delete book
@DataProvider(name = "BooksData")
public Object[][] getData() {
return new Object[][]{
{"Test1", "9321"},
{"Test2", "2213"},
{"Test3", "323"}
};
}
@DataProvider
는 TestNG
에서 지원하는 annotation입니다. annotation의 파라미터 name
에 임의의 이름을 지정해주세요.
위 예시로는 isbn
과 aisle
이라는 두개의 파라미터가 필요하므로, 2개의 element를 가진 배열 3개를 선언하여 return하고 있습니다.
다음은 위 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에서 읽어온다던지 등의 작업을 넣어주면,테스트 코드 자체를 직접적으로 수정하지 않고도 테스트 실행 시 마다 값을 바꾸어줄 수 있을 것입니다.