【问题标题】:Looping through SerenityRest Response in JAVA循环通过 JAVA 中的 SerenityRest 响应
【发布时间】:2019-10-16 14:09:16
【问题描述】:

我正在尝试从汽车对象中获取所有模型的计数,这是 SerenityRest 响应的一部分。

Response response = SerenityRest.rest()
        .contentType("application/json")
        .when()
        .get("/api/");
if (response.statusCode() == 200) {
   int numUniqueModels = response.body().path("cars.size()");  // 3
}

回复:

   "cars": {
       "Acura": [
           "ILX",
           "MDX",
           "TLX"
       ],
       "Audi": [
           "A3",
           "A4",
           "A6",
           "A7"
       ],
       "BMW": [
           "x",
           "y"
       ]
   }

例如,

response.body().path("cars.size()") = 3,

但我需要 cars.Acura.size() + cars.Audi.size() + cars.BMW.size() 的总和才能获得所有型号。但是,我不知道响应中是否存在 Acura、Audi 或 BMW 的确切名称,因为车辆可能会动态变化。为了解决这个问题,我需要做一些循环,其中:

sum = 0; 
for (int i = 0; i < response.body().path("cars.size()"); i++) {
   sum += response.body().path("cars.[i].size()");
}

总和应该给出汽车型号的总数 = 9。 问题是这种语法: path("cars.[i].size()") 不正确。正确的称呼是什么?

【问题讨论】:

  • 您能否提供更大的代码示例以便我查看类型?

标签: java response rest-assured serenity-bdd


【解决方案1】:

如果您想放心地提出复杂的请求,您必须遵循此处描述的合成器 groovy gpath 此处提到的 rest-assured doc

请注意,JsonPath 实现使用 Groovy's GPath 语法,不要与 Jayway 的 JsonPath 实现混淆。

所以你必须使用一些时髦的合成器:

int total = JsonPath.from("{  "
              + " \"cars\": {\n"
              + "       \"Acura\": [\n"
              + "           \"ILX\",\n"
              + "           \"MDX\",\n"
              + "           \"TLX\"\n"
              + "       ],\n"
              + "       \"Audi\": [\n"
              + "           \"A3\",\n"
              + "           \"A4\",\n"
              + "           \"A6\",\n"
              + "           \"A7\"\n"
              + "       ],\n"
              + "       \"BMW\": [\n"
              + "           \"x\",\n"
              + "           \"y\"\n"
              + "       ]\n"
              + "   }"
              + "}")
        .getInt("cars.collect { it.value.size() }.sum()")

所以这个表达式应该使工作cars.collect { it.value.size() }.sum()collect 方法就像函数式编程中的 map 方法。因此,您将集合 cars HashMap 与其值的 size() 映射,然后收集 sum()

编辑

所以你只需要这样做:

Response response = SerenityRest.rest()
        .contentType("application/json")
        .when()
        .get("/api/");
if (response.statusCode() == 200) {
   int numUniqueModels = response.body().path("cars.collect { it.value.size() }.sum()");  // 9
}

【讨论】:

  • 这行不通。我提到响应是动态的,这意味着讴歌、奥迪或宝马可能不存在。如果我不知道里面有什么,我将如何构造 int total = JsonPath.from(".....")?
  • 你试过了吗? JsonPath 是方法path(String) 使用的对象。该表达式遍历 cars 条目并收集每个条目的大小。所以这应该适用于任何元素。所以你只需要:int numUniqueModels = response.body().path("cars.collect { it.value.size() }.sum()"); // 9
  • 你明白了兄弟,我使用了错误的语法。再次感谢您的帮助!
  • np 家伙!寻找解决方案很有趣;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-19
  • 2014-02-26
相关资源
最近更新 更多