Json与RestAssured的完整比赛

BAD*_*EED 8 rest json rest-assured

我正在使用REST-Assured测试一些API。我的API显然会使用JSON响应,并根据文档做出响应(如果这是响应):

{
    "id": "390",
    "data": {
        "leagueId": 35,
        "homeTeam": "Norway",
        "visitingTeam": "England",
    },
    "odds": [{
        "price": "1.30",
        "name": "1"
    },
    {
        "price": "5.25",
        "name": "X"
    }]
}
Run Code Online (Sandbox Code Playgroud)

我可以这样测试:

@Test
public void givenUrl_whenSuccessOnGetsResponseAndJsonHasRequiredKV_thenCorrect() {
   get("/events?id=390")
      .then()
         .statusCode(200)
         .assertThat()
            .body("data.leagueId", equalTo(35)); 
}
Run Code Online (Sandbox Code Playgroud)

当然这是可读的,但我将对JSON进行全面比较(即:这是JSON响应;这是固定的JSON-资源文件将是完美的-这些JSON等于吗?)。REST-Assured是否提供类似的功能,或者我需要手动进行设置。

HaC*_*HaC 9

使用 RestAssured 的 JsonPath 将 json 文件解析为 Map,然后与 Hamcrest Matchers 进行比较。这样订单等就无关紧要了。

import static org.hamcrest.Matchers.equalTo;
import io.restassured.path.json.JsonPath;

...

JsonPath expectedJson = new JsonPath(new File("/path/to/expected.json"));

given()
    ...
    .then()
    .body("", equalTo(expectedJson.getMap("")));
Run Code Online (Sandbox Code Playgroud)


Pet*_*mas 5

空手道正是您正在寻找的 - 您可以一步执行JSON 有效负载的完全相等匹配。

对于具有动态值(生成的键、时间戳)的情况,Karate 为您提供了一种非常优雅的方式来忽略(或仅验证其格式)这些键。

创建空手道的主要动机之一是想出一个更好的替代 REST-assured。您可以参考此文档,它可以帮助您评估 Karate 并在您的组织中为其提供案例:Karate vs REST-assured


Roc*_*oon 0

简单的方法:

String s = "{\"ip\": \"your_ip\"}";
given().log().all().contentType(ContentType.JSON).get("http://ip.jsontest.com/").then().log().all().assertThat().body(containsString(s))
Run Code Online (Sandbox Code Playgroud)

不容易的方法:您可以创建自定义匹配器或使用 jsonpath,它具有 comapre jsons 的选项。