RestAssured:如何检查 json 数组响应的长度?

Posted

技术标签:

【中文标题】RestAssured:如何检查 json 数组响应的长度?【英文标题】:RestAssured: How to check the length of json array response? 【发布时间】:2016-07-27 22:53:10 【问题描述】:

我有一个返回 JSON 的端点:

[
  "id" : 4, "name" : "Name4",
  "id" : 5, "name" : "Name5"
]

还有一个 DTO 类:

public class FooDto 
    public int id;
    public String name;

现在,我正在以这种方式测试返回的 json 数组的长度:

@Test
public void test() 
    FooDto[] foos = RestAssured.get("/foos").as(FooDto[].class);
    assertThat(foos.length, is(2));

但是,有没有什么方法可以在不强制转换为 FooDto 数组的情况下做到这一点?像这样的:

@Test
public void test() 
    RestAssured.get("/foos").then().assertThat()
      .length(2);

【问题讨论】:

【参考方案1】:

解决了!我是这样解决的:

@Test
public void test() 
    RestAssured.get("/foos").then().assertThat()
      .body("size()", is(2));

【讨论】:

【参考方案2】:

你可以简单地在你的身体路径中调用size()

喜欢:

given()
            .accept(ContentType.JSON)
            .contentType(ContentType.JSON)
            .auth().principal(createPrincipal())
            .when()
            .get("/api/foo")
            .then()
            .statusCode(OK.value())
            .body("bar.size()", is(10))
            .body("dar.size()", is(10));

【讨论】:

【参考方案3】:

有办法。我用下面的方法解决了

@Test
public void test() 
 ValidatableResponse response = given().when().get("/foos").then();
 response.statusCode(200);
 assertThat(response.extract().jsonPath().getList("$").size(), equalTo(2));

使用放心的 3.0.0

【讨论】:

【参考方案4】:

我用 GPath 解决了类似的任务。

Response response = requestSpec
                .when()
                .get("/new_lesson")
                .then()
                .spec(responseSpec).extract().response();

现在我可以将响应正文提取为字符串并使用内置的 GPath 功能

String responseBodyString = response.getBody().asString();

assertThat(from(responseBodyString).getList("$").size()).isEqualTo(YOUR_EXPECTED_SIZE_VALUE);
assertThat(from(responseBodyString).getList("findAll  it.name == 'Name4' ").size()).isEqualTo(YOUR_EXPECTED_SUB_SIZE_VALUE);

完整示例见http://olyv-qa.blogspot.com/2017/07/restassured-short-example.html

【讨论】:

【参考方案5】:

@Héctor

[   
   "id" : 4, "name" : "Name4", 
   "id" : 5, "name" : "Name5"
]

真是个倒霉的例子。这里有矩阵 [2,2]。

如果你创建这样的东西:

[   
   "id" : 4, "name" : "Name4", 
   "id" : 5, "name" : "Name5", 
   "id" : 6, "name" : "Name6" 
]

现在你仍然通过了测试:

@Test
public void test() 
    RestAssured.get("/foos").then().assertThat()
      .body("size()", is(2));

考虑是否是故意的。 body("size()",is(2)); 有一个节点的长度而不是响应的记录数。

【讨论】:

【参考方案6】:

这是你需要做的才能获得大小。

Response response = 
given()
.header("Accept","application/json")
.when()
.get("/api/nameofresource")
.then()
.extract()
.response();

得到响应后,您可以执行以下操作来获取大小。

int size = response.jsonPath().getList("id").size();

希望这会有所帮助。 :)

【讨论】:

【参考方案7】:

也可能的选项是hasSize() 匹配器以及"." 路径:

import static org.hamcrest.Matchers.hasSize;

...

@Test
public void test() 
    RestAssured.get("/foos").then().assertThat()
      .body(".", hasSize(2));

【讨论】:

以上是关于RestAssured:如何检查 json 数组响应的长度?的主要内容,如果未能解决你的问题,请参考以下文章

如何将 JSON 响应发送到 Swift 3 中的另一个视图

无法将 JSON 响应分配给预先声明的数组

RestAssured 中的无效 JSON Schema 异常,同时针对来自 swagger 的模式进行验证

无方法签名:static io.restassured.internal.http.URIBuilder.encode()

如何检查 JSON 对象数组是不是包含数组中定义的值?

如何检查 JSON 对象数组中是不是存在键