API 테스트에 Java 및 REST Assured 사용
25075 단어 thebeatlestestingtutorialjava
이 기사에서 REST-Assured의 몇 가지 더 많은 특성을 소개하고 자동화 API 테스트에서 사용하고자 하는 방식을 예를 들어 설명하고자 합니다.
보상으로 비틀즈에게서 앨범에 관한 것을 배울 수 있을 거야!
JSON 서버 설정
이전 글에서, 우리는 테스트에서 사용 가능한 REST 단점을 공개했다.본고에서, 나는 나를 위해 창설하고 정의한 단점 구축 테스트를 원한다.이를 위해, 나는 JSON server라는 소스 오픈 도구를 사용하여 로컬에서 자신의 단점을 신속하게 설정할 것이다.
시스템에서 설정하려면 다음과 같이 하십시오.
npm install -g json-server
로컬에 json 서버 설치{
"albums": [
{
"id": 1,
"artist": "The Beatles",
"title": "Please Please Me",
"year": "1963"
},
{
"id": 2,
"artist": "The Beatles",
"title": "With the Beatles",
"year": "1963"
},
{
"id": 3,
"artist": "The Beatles",
"title": "A Hard Day's Night",
"year": "1964"
},
{
"id": 4,
"artist": "The Beatles",
"title": "Beatles for Sale",
"year": "1964"
},
{
"id": 5,
"artist": "The Beatles",
"title": "Help!",
"year": "1965"
}
]
}
music-db.json
데이터 검색을 위한 노드를 제공하는 것 외에 JSON 서버는 POST, PUT, PATCH,DELETE 요청을 보내서 아날로그 노드의 이상적인 해결 방안이 되도록 합니다.
JSON 서버를 사용하면 개발자가 포트를 실현하기 전에 API 포트에 대한 테스트를 시작할 수 있습니다.예상한 응답을 쉽게 시뮬레이션할 수 있습니다. API가 실현되면 테스트는 JSON 서버가 아닌 이 실행을 가리킬 수 있습니다.개발 및 API 테스트 자동화는 병행할 수 있습니다.
이제 테스트를 만들어 봅시다!
기본 URI 설정하기
여전히 테스트 항목을 설정해야 한다면 볼 수 있습니다.
우리가 너무 멀리 가기 전에 테스트를 위한 기본 URI를 설정하자.테스트 태그json-server --watch music-db.json
를 사용하여 기본 URI를 설정합니다.
@BeforeClass
public void setup() {
RestAssured.baseURI = "http://localhost";
RestAssured.port = 3000;
}
안심하고 매개변수 사용
REST API를 사용하면 id를 사용하여 경로 매개 변수 또는 질의 문자열 매개 변수로 전달할 수 있는 특정 항목의 데이터를 읽어들일 수 있습니다.
경로 매개 변수
우리의 예시 데이터에서 id2의 데이터만 되돌려주고 싶다면 다음과 같은 경로 파라미터를 사용할 수 있습니다: http://localhost:3000/albums/2
이 때문에 안심할 수 있는 테스트를 만들고 앨범 제목이 기대에 부합되는지 확인합니다.
테스트 클래스에 새 테스트를 만들려면 다음과 같이 하십시오.
@Test
public void queryParamExample() {
String idToGet = "2";
String expectedTitle = "With the Beatles";
// @formatter:off
given().
param("id", idToGet).
when().
get("albums").
then().
assertThat().
body("title[0]", equalToIgnoringCase(expectedTitle));
// @formatter:on
}
이 테스트는 앨범 id 2를 획득하고 제목이'비틀즈'임을 검증했다.테스트를 계속합니다.초록색일 거예요.
물론 녹색 테스트를 믿지 않기 때문에 id나 예상 제목을 임시로 변경하고 실패했는지 확인합니다.예를 들어 @BeforeClass
를 유사한 내용expectedTitle
으로 변경하면 실패한 테스트와 다음과 같은 오류가 발생합니다.
질의 문자열 매개변수
path 매개변수 외에도 다음과 같은 질의 문자열 매개변수를 사용할 수 있습니다.
http://localhost:3000/albums?id=2
물론, 우리는 id를 통해 데이터를 검색하는 것에 국한되지 않습니다. 우리는 프로젝트 제목과 같은 다른 필드를 통해 데이터를 검색할 수 있습니다.
http://localhost:3000/albums?title=With%20the%20Beatles
이제 테스트를 만듭니다.
@Test
public void queryParamExample() {
Integer expectedId = 2;
String titleToGet = "With the Beatles";
// @formatter:off
given().
param("title", titleToGet).
when().
get("albums").
then().
assertThat().
body("id[0]", equalTo(expectedId));
// @formatter:on
}
이것은 이전 테스트의 변체입니다. 제목에 따라 id를 검색하고 검증하고 있기 때문입니다.
이 두 가지 테스트는 모두 하드코딩된 테스트 데이터를 가지고 있는데, 이것은 통상적으로 이상적이지 않다.다른 전략을 시도해 봅시다.
API 호출 간 데이터 공유
이 예에서는 2개의 API 호출을 수행합니다.첫 번째 호출은 모든 앨범을 가져오고 응답 대상에 대한 json 응답을 추출하는 것입니다.
두 번째 호출은 id에 따라 단일 음반집을 검색한 다음 음반집 제목이 첫 번째 호출에서 추출한 음반집 제목과 일치한다고 단언합니다.
@Test
public void extractDataAndPassToNextAPICall() {
// @formatter:off
Response response = given().
when().
get("albums").
then().
extract().
response();
String validId = response.jsonPath().getString("id[0]");
String validTitle = response.jsonPath().getString("title[0]");
given().
pathParam("id", validId).
when().
get("albums/{id}").
then().
assertThat().
body("title", equalTo(validTitle));
// @formatter:on
}
이 정책을 사용하면 첫 번째 호출은 유효한 테스트 데이터를 추출하는 데 사용되며, 두 번째 호출이 정확한 데이터로 되돌아오는 것을 확인할 수 있습니다.우리가 하드코딩 테스트 데이터가 없는 상황에서 테스트를 진행하기 때문에, 밑바닥 데이터에 대한 변경은 테스트에 실패하지 않을 것이다.
게시물
GET 끝점을 테스트하는 것 외에 POST와 DELETE도 테스트할 수 있습니다.새 앨범을 발표하고 응답을 검증하기 위한 테스트를 만듭니다.
@Test
public void postNewAlbum() {
Header acceptJson = new Header("Accept", "application/json");
JSONObject requestParams = new JSONObject();
requestParams.put("artist", "The Beatles");
requestParams.put("title", "Rubber Soul");
requestParams.put("year", "1965");
// @formatter:off
//add the new album
Response response =
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
post("/albums").
then().
statusCode(201).
body("$", hasKey("id")).
body("title",equalTo("Rubber Soul")).
body("year",equalTo("1965")).
extract().response();
// @formatter:on
}
이 테스트를 통해 우리는 새 앨범과 관련된 데이터를 발표했다.우리는 예술가, 제목, 새 앨범의 연도를 포함하는 새로운 JSONObject를 만들어서 이를 실현했다.그리고 이 대상을 테스트"With the Monkeys"
부분body
에 추가합니다.
JSONObject 참조를 얻기 위해 POM 파일에 의존 항목을 추가해야 합니다.
<dependency>
<groupId>top.jfunc.common</groupId>
<artifactId>converter</artifactId>
<version>1.8.0</version>
</dependency>
given
섹션에서는 데이터가 성공적으로 게시되었는지 확인하고 있습니다.우리는 응답에서 되돌아오는 데이터를 최초로 보낸 데이터와 비교함으로써 이 점을 실현한다.이 테스트를 계속 실행하면 녹색일 것이다.여느 때와 마찬가지로, 마땅할 때 실패할 수 있도록 몇 가지 일을 바꾸어라.
삭제
이제 삭제를 검증하기 위한 테스트를 만들 수 있습니다.새 앨범이 추가되었으므로 추가 후 삭제합니다.
@Test
public void postNewAlbumThenDelete() {
Header acceptJson = new Header("Accept", "application/json");
JSONObject requestParams = new JSONObject();
requestParams.put("artist", "The Beatles");
requestParams.put("title", "A Hard Day's Night");
requestParams.put("year", "1964");
// @formatter:off
//add the new album
Response response =
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
post("/albums").
then().
statusCode(201).
body("$", hasKey("id")).
body("title",equalTo("A Hard Day's Night")).
body("year",equalTo("1964")).
extract().response();
//delete album that was just added
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
delete("/albums/" + response.jsonPath().getInt("id")).
then().
statusCode(200);
//try to get the album we just deleted
given().
when().
get("/albums/" + response.jsonPath().getInt("id")).
then().
statusCode(404);
// @formatter:on
}
이 테스트를 통해 3개의 API 호출이 수행되었습니다.
@BeforeClass
public void setup() {
RestAssured.baseURI = "http://localhost";
RestAssured.port = 3000;
}
REST API를 사용하면 id를 사용하여 경로 매개 변수 또는 질의 문자열 매개 변수로 전달할 수 있는 특정 항목의 데이터를 읽어들일 수 있습니다.
경로 매개 변수
우리의 예시 데이터에서 id2의 데이터만 되돌려주고 싶다면 다음과 같은 경로 파라미터를 사용할 수 있습니다: http://localhost:3000/albums/2
이 때문에 안심할 수 있는 테스트를 만들고 앨범 제목이 기대에 부합되는지 확인합니다.
테스트 클래스에 새 테스트를 만들려면 다음과 같이 하십시오.
@Test
public void queryParamExample() {
String idToGet = "2";
String expectedTitle = "With the Beatles";
// @formatter:off
given().
param("id", idToGet).
when().
get("albums").
then().
assertThat().
body("title[0]", equalToIgnoringCase(expectedTitle));
// @formatter:on
}
이 테스트는 앨범 id 2를 획득하고 제목이'비틀즈'임을 검증했다.테스트를 계속합니다.초록색일 거예요.물론 녹색 테스트를 믿지 않기 때문에 id나 예상 제목을 임시로 변경하고 실패했는지 확인합니다.예를 들어
@BeforeClass
를 유사한 내용expectedTitle
으로 변경하면 실패한 테스트와 다음과 같은 오류가 발생합니다.질의 문자열 매개변수
path 매개변수 외에도 다음과 같은 질의 문자열 매개변수를 사용할 수 있습니다.
http://localhost:3000/albums?id=2
물론, 우리는 id를 통해 데이터를 검색하는 것에 국한되지 않습니다. 우리는 프로젝트 제목과 같은 다른 필드를 통해 데이터를 검색할 수 있습니다.
http://localhost:3000/albums?title=With%20the%20Beatles
이제 테스트를 만듭니다.
@Test
public void queryParamExample() {
Integer expectedId = 2;
String titleToGet = "With the Beatles";
// @formatter:off
given().
param("title", titleToGet).
when().
get("albums").
then().
assertThat().
body("id[0]", equalTo(expectedId));
// @formatter:on
}
이것은 이전 테스트의 변체입니다. 제목에 따라 id를 검색하고 검증하고 있기 때문입니다.이 두 가지 테스트는 모두 하드코딩된 테스트 데이터를 가지고 있는데, 이것은 통상적으로 이상적이지 않다.다른 전략을 시도해 봅시다.
API 호출 간 데이터 공유
이 예에서는 2개의 API 호출을 수행합니다.첫 번째 호출은 모든 앨범을 가져오고 응답 대상에 대한 json 응답을 추출하는 것입니다.
두 번째 호출은 id에 따라 단일 음반집을 검색한 다음 음반집 제목이 첫 번째 호출에서 추출한 음반집 제목과 일치한다고 단언합니다.
@Test
public void extractDataAndPassToNextAPICall() {
// @formatter:off
Response response = given().
when().
get("albums").
then().
extract().
response();
String validId = response.jsonPath().getString("id[0]");
String validTitle = response.jsonPath().getString("title[0]");
given().
pathParam("id", validId).
when().
get("albums/{id}").
then().
assertThat().
body("title", equalTo(validTitle));
// @formatter:on
}
이 정책을 사용하면 첫 번째 호출은 유효한 테스트 데이터를 추출하는 데 사용되며, 두 번째 호출이 정확한 데이터로 되돌아오는 것을 확인할 수 있습니다.우리가 하드코딩 테스트 데이터가 없는 상황에서 테스트를 진행하기 때문에, 밑바닥 데이터에 대한 변경은 테스트에 실패하지 않을 것이다.
게시물
GET 끝점을 테스트하는 것 외에 POST와 DELETE도 테스트할 수 있습니다.새 앨범을 발표하고 응답을 검증하기 위한 테스트를 만듭니다.
@Test
public void postNewAlbum() {
Header acceptJson = new Header("Accept", "application/json");
JSONObject requestParams = new JSONObject();
requestParams.put("artist", "The Beatles");
requestParams.put("title", "Rubber Soul");
requestParams.put("year", "1965");
// @formatter:off
//add the new album
Response response =
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
post("/albums").
then().
statusCode(201).
body("$", hasKey("id")).
body("title",equalTo("Rubber Soul")).
body("year",equalTo("1965")).
extract().response();
// @formatter:on
}
이 테스트를 통해 우리는 새 앨범과 관련된 데이터를 발표했다.우리는 예술가, 제목, 새 앨범의 연도를 포함하는 새로운 JSONObject를 만들어서 이를 실현했다.그리고 이 대상을 테스트"With the Monkeys"
부분body
에 추가합니다.
JSONObject 참조를 얻기 위해 POM 파일에 의존 항목을 추가해야 합니다.
<dependency>
<groupId>top.jfunc.common</groupId>
<artifactId>converter</artifactId>
<version>1.8.0</version>
</dependency>
given
섹션에서는 데이터가 성공적으로 게시되었는지 확인하고 있습니다.우리는 응답에서 되돌아오는 데이터를 최초로 보낸 데이터와 비교함으로써 이 점을 실현한다.이 테스트를 계속 실행하면 녹색일 것이다.여느 때와 마찬가지로, 마땅할 때 실패할 수 있도록 몇 가지 일을 바꾸어라.
삭제
이제 삭제를 검증하기 위한 테스트를 만들 수 있습니다.새 앨범이 추가되었으므로 추가 후 삭제합니다.
@Test
public void postNewAlbumThenDelete() {
Header acceptJson = new Header("Accept", "application/json");
JSONObject requestParams = new JSONObject();
requestParams.put("artist", "The Beatles");
requestParams.put("title", "A Hard Day's Night");
requestParams.put("year", "1964");
// @formatter:off
//add the new album
Response response =
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
post("/albums").
then().
statusCode(201).
body("$", hasKey("id")).
body("title",equalTo("A Hard Day's Night")).
body("year",equalTo("1964")).
extract().response();
//delete album that was just added
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
delete("/albums/" + response.jsonPath().getInt("id")).
then().
statusCode(200);
//try to get the album we just deleted
given().
when().
get("/albums/" + response.jsonPath().getInt("id")).
then().
statusCode(404);
// @formatter:on
}
이 테스트를 통해 3개의 API 호출이 수행되었습니다.
@Test
public void extractDataAndPassToNextAPICall() {
// @formatter:off
Response response = given().
when().
get("albums").
then().
extract().
response();
String validId = response.jsonPath().getString("id[0]");
String validTitle = response.jsonPath().getString("title[0]");
given().
pathParam("id", validId).
when().
get("albums/{id}").
then().
assertThat().
body("title", equalTo(validTitle));
// @formatter:on
}
GET 끝점을 테스트하는 것 외에 POST와 DELETE도 테스트할 수 있습니다.새 앨범을 발표하고 응답을 검증하기 위한 테스트를 만듭니다.
@Test
public void postNewAlbum() {
Header acceptJson = new Header("Accept", "application/json");
JSONObject requestParams = new JSONObject();
requestParams.put("artist", "The Beatles");
requestParams.put("title", "Rubber Soul");
requestParams.put("year", "1965");
// @formatter:off
//add the new album
Response response =
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
post("/albums").
then().
statusCode(201).
body("$", hasKey("id")).
body("title",equalTo("Rubber Soul")).
body("year",equalTo("1965")).
extract().response();
// @formatter:on
}
이 테스트를 통해 우리는 새 앨범과 관련된 데이터를 발표했다.우리는 예술가, 제목, 새 앨범의 연도를 포함하는 새로운 JSONObject를 만들어서 이를 실현했다.그리고 이 대상을 테스트"With the Monkeys"
부분body
에 추가합니다.JSONObject 참조를 얻기 위해 POM 파일에 의존 항목을 추가해야 합니다.
<dependency>
<groupId>top.jfunc.common</groupId>
<artifactId>converter</artifactId>
<version>1.8.0</version>
</dependency>
given
섹션에서는 데이터가 성공적으로 게시되었는지 확인하고 있습니다.우리는 응답에서 되돌아오는 데이터를 최초로 보낸 데이터와 비교함으로써 이 점을 실현한다.이 테스트를 계속 실행하면 녹색일 것이다.여느 때와 마찬가지로, 마땅할 때 실패할 수 있도록 몇 가지 일을 바꾸어라.삭제
이제 삭제를 검증하기 위한 테스트를 만들 수 있습니다.새 앨범이 추가되었으므로 추가 후 삭제합니다.
@Test
public void postNewAlbumThenDelete() {
Header acceptJson = new Header("Accept", "application/json");
JSONObject requestParams = new JSONObject();
requestParams.put("artist", "The Beatles");
requestParams.put("title", "A Hard Day's Night");
requestParams.put("year", "1964");
// @formatter:off
//add the new album
Response response =
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
post("/albums").
then().
statusCode(201).
body("$", hasKey("id")).
body("title",equalTo("A Hard Day's Night")).
body("year",equalTo("1964")).
extract().response();
//delete album that was just added
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
delete("/albums/" + response.jsonPath().getInt("id")).
then().
statusCode(200);
//try to get the album we just deleted
given().
when().
get("/albums/" + response.jsonPath().getInt("id")).
then().
statusCode(404);
// @formatter:on
}
이 테스트를 통해 3개의 API 호출이 수행되었습니다.
@Test
public void postNewAlbumThenDelete() {
Header acceptJson = new Header("Accept", "application/json");
JSONObject requestParams = new JSONObject();
requestParams.put("artist", "The Beatles");
requestParams.put("title", "A Hard Day's Night");
requestParams.put("year", "1964");
// @formatter:off
//add the new album
Response response =
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
post("/albums").
then().
statusCode(201).
body("$", hasKey("id")).
body("title",equalTo("A Hard Day's Night")).
body("year",equalTo("1964")).
extract().response();
//delete album that was just added
given().
contentType(ContentType.JSON).
body(requestParams.toString()).
when().
delete("/albums/" + response.jsonPath().getInt("id")).
then().
statusCode(200);
//try to get the album we just deleted
given().
when().
get("/albums/" + response.jsonPath().getInt("id")).
then().
statusCode(404);
// @formatter:on
}
마무리
이 문서는 REST Assured를 사용하여 API 엔드포인트를 테스트할 수 있는 좋은 출발점이 될 것입니다.물론 제가 묘사한 기초 지식보다 훨씬 많기 때문에 계속해서 공식 사이트REST Assured website에서 더 많은 연구를 하세요.인터넷에는 많은 자원이 있다.
만약 네가 비틀즈의 정보를 얻기 위해 이 글을 왔다면, 지금 너는 실망할 것이다.좋은 소식은 앨범이 위에서 언급한 것보다 많기 때문에check out the web!
너는 my Github project에서 이 블로그 글의 전체 코드를 찾을 수 있다.
앞으로의 게시물에서 저는 JSON 모델 검증과 보고를 주목할 것이니 계속 주목해 주십시오.
Reference
이 문제에 관하여(API 테스트에 Java 및 REST Assured 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/leading-edje/api-testing-with-java-and-the-beatles-4624
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(API 테스트에 Java 및 REST Assured 사용), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/leading-edje/api-testing-with-java-and-the-beatles-4624텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)