Удаленка для jenkins+selenide+selenoid+allure+docker спецов на 2-3 часа в день. 100% remote! Присоединиться к проекту

Rest Assured.Как проверить весь json из response

rest
rest-assured
restapi
java
Теги: #<Tag:0x00007fedbb90aac8> #<Tag:0x00007fedbb90a898> #<Tag:0x00007fedbb90a730> #<Tag:0x00007fedbb90a5f0>

(Vikss Vik) #1

Привет! Пишу тест по API с применением Rest Assured.
Мой тес проверяет API по настройкам безопасности пароля

 @Test(description = "Настройки безопасности пароля пользователя ")
    public void securityPolise() {
        File json = new File(PATH_TO_USER_SECURITY);
        testLogger.info("\n... password security settings...\n");
        given()
                .headers(getAdminCookie())
                .contentType(JSON)
                .log().all()
                .body(json)
                .when().put(STABLE_BASE_URL + API_MOD_ACL + API_MOD_ACL_SECURITY_POLICE)
                .then().log().body()
                .assertThat().statusCode(200)
                .body("password_diff_from_old", equalTo(false))
                .body("password_req_low_letter", equalTo(true))
                .body("password_diff_from_old_symbols", equalTo((2)));

Отправляю Put запрос с теле указываю json

{
  "password_min_length":8,
  "password_req_spec":false,
  "password_req_digit":true,
  "password_req_up_letter":false,
  "password_req_low_letter":true,
  "password_diff_from_old":false,
  "password_diff_from_old_symbols":2
}

В ответ приходит json 
{
    "user_max_sessions": 91,
    "user_lock_after_overflow_sessions": false,
    "user_auth_fails_limit": 6,
    "user_lock_duration": 5,
    "user_failed_auths_idle": 1,
    "user_session_max_idle": 241,
    "password_expired_time": 365,
    "password_min_length": 8,
    "password_req_spec": false,
    "password_req_digit": true,
    "password_req_up_letter": false,
    "password_req_low_letter": true,
    "password_diff_from_old": false,
    "password_diff_from_old_symbols": 2,
    "unused_account_change_password_after": 180
}

Нужно проверить ,что все значения ,которые пришли верные .Поскольку json длинный,каждое поле проверять неудобно , будет длинные тест .К примеру :slight_smile: .assertThat().statusCode(200)
.body(“password_diff_from_old”, equalTo(false))

и так на каждое поле .Как наиболее компактно( без ассертов на каждую строку json)проверить json из response


(Евгений Салмин) #2

Используйте десериализацию и переопределяйте метод equals()


(Богдан Ткаченко) #3

Просто создай мапу со значениями которые надо проверить (в этой мапе будут находится верные значения), потом получившийся респонс кидаешь его в мапу и потом сравниваешь эти две мапы. Это такой быстрый костыль для проверки. Если тебе просто срочно нужно.


(Danteg233) #4

Привет, тут пару вариантов, в любом случае придется либо руками все это проверять, можно через jsonPath или перевести response в dto и проверить поля, либо сделать где то заготовку, т.е. обьект или json с уже верными значениями, и сравнить что они равны. А вообще, я бы советовал вам ассерты вынести на другой уровень, и там написать нормальную проверку, в тесте будет всего 1 метод который проверяет response и все.


(Dunecat Shai Hulud) #5

А чем не подходит ResponseSpecBuilder?


(Владимир) #6

Как раз для таких целей придуман формат json schema


#7

json schema проверяет только поля но не значения.


(Vikss Vik) #8

А как мне его использовать ? Я так понимаю он подходит для повторяющихся ожиданий в тесте


(Dmitri Komarist) #9

Ну судя по вашим проверкам Вам нужно проверить что свойства и значения отправленого объекта в теле запроса будут включёны в тело ответа.
Я не знаком с тем фреймворком с которым Вы работаете, но возможно в нем присутствует метод “include”
assertThat().body(include(json))
Ну и конечно обязательно проверка на JSON Shema

Я бы строил проверки следующим образом:

  1. проверка на статус код - 200(201)
  2. проверка на то что тело ответа JSON (возможно это необязательно для Java, но в JS response может быть undefined и обращение к его телу вызовет ошибку, для этого я и использую заградительное утверждение)
  3. проверка на сравнение с JSON Shema
  4. проверка на то что тело ответа включает объект из тела запроса

(Vikss Vik) #10

Спасибо поняла.В Hamcrest include нет .Если кто знает в RestAssured как проверить , что свойства и значения отправленого объекта в теле запроса будут включёны в тело ответа,напишите и сама погуглю


(Dmitri Komarist) #11

Насколько я понял у Вас используется библиотека Hamcrest для выполнения проверок и в ней действительно нет готового метода “include()”. Но судя по документации можно легко написать custom matchers. Вот ссылка https://code.google.com/archive/p/hamcrest/wikis/Tutorial.wiki

Если же не охота заморачиватся то можно заменить библиотеку ассертов на “fest-assert” в ней уже есть .includes() и синтаксис не очень сильно отличается он Hamcrest


(r292) #12
  1. http://www.jsonschema2pojo.org/
  2. https://habr.com/company/naumen/blog/228279/
  3. тест