Rest Assured Framework завершает сопоставление ответов JSON

Я использую Rest Assured Framework для тестирования API (с использованием Java). В строке (1) я ожидаю ошибки, поскольку есть несоответствие в ожидаемом ответе JSON и фактическом ответе JSON. Но вместо этого мой код выполняется успешно. Может кто-нибудь сказать мне, делаю ли я что-то не так в приведенном ниже коде?

     public void test123() {
            try {
                //Read the Curl Request Input file
                String json = input.readFromTextFile(
                        System.getProperty("user.dir") + "\\src\\test\\resources\\inputFile\\CurlDataFile.txt");
                json = json.replaceAll(" ", "");            
                RestAssured.baseURI = "My URL";
                given().
                    contentType("application/json").
                    body(json).
                when().
                    post("").
                then().
assertThat().body(matchesJsonSchemaInClasspath("testCurlOuput1.json"));  (1)
            } catch (IOException e) {
                e.printStackTrace();
            }catch(JsonSchemaValidationException e){
                e.printStackTrace();
            }
        }

person SachinB    schedule 26.07.2016    source источник


Ответы (4)


Это не имеет прямого отношения к REST-гарантированному, но я предлагаю вам взглянуть на Каратэ, потому что IMO это может быть именно то, что вы ищете.

Одна из основных функций Karate заключается в том, что вы можете выполнить полное соответствие равенства полезной нагрузки JSON за один шаг.

И вы можете легко использовать JSON из файлов, что поощряет повторное использование полезных нагрузок в нескольких тестах.

person Peter Thomas    schedule 05.07.2017

Вы ловите все исключения. Когда ваш assertThat (..) терпит неудачу, он генерирует исключение. Установите точку останова на e.printStackTrace (); запустите в режиме DEBUG и убедитесь, что ваше исключение AssertionException / Error не перехвачено.

Вместо того, чтобы перехватывать исключения, просто добавьте все отмеченные исключения в свою тестовую подпись. Если исключение не перехвачено, оно не пройдёт проверку. В качестве альтернативы, но менее предпочтительной, на мой взгляд, разрешите проблему, поместив fail (); в блоке захвата.

person Tom Cools    schedule 26.07.2016
comment
Но мой код не выдает ошибки, поэтому речь не идет об обработке исключения. - person SachinB; 26.07.2016
comment
Когда ваш assertThat () .. терпит неудачу, этот метод выдает исключение :-). Ошибка утверждения = ›Исключение. Вот почему ошибки утверждения не позволяют выполнить тесты JUnit. - person Tom Cools; 26.07.2016
comment
В вашем случае matchJsonSchemaInClassPath выдает исключение JsonSchemaValidationException, если оно не совпадает. Вы перехватываете это исключение вместо того, чтобы позволить ему всплыть и провалить тест. (обнаружил это имя исключения на страницах GITHUB RestAssured: github.com/rest-assured/rest- уверен) - person Tom Cools; 26.07.2016
comment
Согласно вашему высказыванию, я удалил общее исключение с помощью JsonSchemaValidationException, но мой код никогда не достигает исключения и не завершается успешно, тогда как я ожидаю, что он должен выдать некоторую ошибку, поскольку фактический ответ JSON не соответствует ожидаемому ответу (поскольку я тестировал ответы с другим Библиотека Java, HTTPURLClient) - person SachinB; 26.07.2016
comment
Не могли бы вы обновить приведенный выше пример? :) Это упрощает обсуждение - person Tom Cools; 26.07.2016
comment
Вообще не ловите исключения. Удалите Try Catch и добавьте исключения в свою подпись. Вы все еще обнаруживаете исключения в своих тестах. - person Tom Cools; 26.07.2016
comment
public void test123 () выдает исключение IOException, JsonSchemaValidationException - person Tom Cools; 26.07.2016

Наконец, я выбираю другую библиотеку, то есть библиотеку jayway.restassured, а затем библиотеку JSON Assert (org.skyscreamer.jsonassert.JSONAssert), которая сравнивает фактический и ожидаемый ответ.

public void test123() {         
String postData = input.readFromTextFile(System.getProperty("user.dir") + "\\src\\test\\resources\\inputFile\\CurlDataFile.txt");
        RestAssured.baseURI = "MY URL";
Response r = (Response)given().contentType("application/json").body(postData).when().post("");
            String responseBody = r.getBody().asString();           
            String curlResponse = //I am providing expected Curl response here          
       //JSON Assertion for matching Expected and Actual response
            JSONAssert.assertEquals(curlResponse, responseBody, false);
        }

Также иногда мы можем захотеть избежать сравнения определенного поля из JSON, например, некоторого поля идентификатора, которое генерируется динамически, что мы можем сделать с помощью компаратора JSON.

person SachinB    schedule 29.07.2016

Я поклонник JSONAssert, поскольку это обеспечивает легкое сравнение полных JSON.

Просто используйте .extract().response().getBody().asString(), чтобы получить строковое представление ответа.

Полный пример:

@Test
public void getReturnsExpectedDataForMailExampleCom() throws JSONException {
    String response = get("/users/[email protected]")
        .then()
        .statusCode(200)
        .extract().response().getBody().asString();
    JSONAssert.assertEquals(
        "{\"email\":\"[email protected]\",\"locale\":\"de-DE\"}",
        response,
        false);
}

Обновление. Недостатком является то, что полный JSON не выводится на стандартный вывод, если утверждение не выполняется.

person koppor    schedule 19.02.2017