t.me/atinfo_chat Telegram группа по автоматизации тестирования

Тестирование REST API Проверка response body

rest
parameterized
api
rest-assured
java
http
qa
json
restapi
Теги: #<Tag:0x00007fb2f98a5648> #<Tag:0x00007fb2f98a5418> #<Tag:0x00007fb2f98a52d8> #<Tag:0x00007fb2f98a5170> #<Tag:0x00007fb2f98a4f40> #<Tag:0x00007fb2f98a4d10> #<Tag:0x00007fb2f98a4a40> #<Tag:0x00007fb2f98a4838> #<Tag:0x00007fb2f98a4540>

#1

Всем привет! Учусь писать тесты на АПИ и хотелось бы спросить совета у знающих людей:slight_smile:

Вопрос следующий: Как лучше и правильнее проверять пришедший ответ в json, если он очень большой, json состоит из около 90 выходных параметров. Как правильнее поступить: проверять отдельно каждый параметр в тесте или просто сравнивать 2 объекта (т.е. сразу все параметры)?
Использую restAssured, сейчас получается как-то так:

@Test
    public void someTest1(){
        Response actualResponse  =
                given()
                        .spec(requestSpec)
                        .body(request)
                .when()
                        .post("/someEndPoint")
                .then()
                        .statusCode(200)
                        .spec(responseSpec)
                        .extract().body().as(Response.class);
      assertThat(actualResponse , equalTo(expectedResponse));
    }

но в этом случае, если при сравнении возникла какая-то ошибка, допустим, значения не соответствуют ожидаемому, то в AssertionError не указано конкретное значение, в котором возникла ошибка, в этом случае выводится просто весь список параметров и его значений, что затрудняет поиск несоответствий. Если бы проверка была по каждому параметру отдельно, то такой проблемы бы не возникало, например:
assertThat(actualResponse.getParam1 (), equalTo(expectedResponse.getParam1()));
Но писать такие проверки на каждый параметр из json довольно объемно, как всё же стоит делать проверки?)


(Vadam) #2

Привет,
Лучше всего делать такие асерции на POJO.
Почитай https://techndeck.com/serialization-and-de-serialization-using-rest-assured/


(Valentin G ) #3

Соглашусь с @Vadam, работаю с C#, использую десериализацию в обьекты. Немного дольше, зато все что надо проверяется. Но походу, RestAssured позволяет проверять конкретно поля респонса.
Пример:

@Test
public void givenMovieId_whenMakingGetRequestToMovieEndpoint_thenReturnMovie() {
 
    Movie testMovie = new Movie(1, "movie1", "summary1");
    when(appService.findMovie(1)).thenReturn(testMovie);
 
    get(uri + "/movie/" + testMovie.getId()).then()
      .assertThat()
      .statusCode(HttpStatus.OK.value())
      .body("id", equalTo(testMovie.getId()))
      .body("name", equalTo(testMovie.getName()))
      .body("synopsis", notNullValue());
}

Взято отсюда.


(Александр Толстопятов) #4

Для python есть модуль deepdiff, который сравнивает 2 json’а, а потом выводит в почти удобном виде, какие конкретные поля отличаются, каких вовсе нет, какие дублируется и т.д.

Для java тоже должна быть похожая подходящая библиотека.
Гугл выдал, к примеру, JSONassert: https://github.com/skyscreamer/JSONassert
Еще AssertJ может так сравнивать 2 объекта: https://assertj.github.io/doc/#assertj-core-recursive-comparison