【问题标题】:How to validate correct values of elements inside arrays with Rest assured如何用放心验证数组内元素的正确值
【发布时间】:2016-02-09 16:34:48
【问题描述】:

我正在尝试验证我的响应的某些属性,如 rest assured tutorial 中所示。

问题在于,在测试数组内的属性时,我可以验证它们是否出现,如示例中所示,但不能验证它们是否与元素的其他属性匹配。

为了澄清,假设我收到了教程的回复(添加了“奖品”)

{
"lotto":{
 "lottoId":5,
 "winning-numbers":[2,45,34,23,7,5,3],
 "winners":[{
   "winnerId":23,
   "prize":5000,
   "numbers":[2,45,34,23,3,5]
 },{
   "winnerId":54,
   "prize":100000,
   "numbers":[52,3,12,11,18,22]
 }]
}
}

我可以验证 winnerIds 为 23 和 54

expect().
         body("lotto.lottoId", equalTo(5)).
         body("lotto.winners.winnderId", hasItems(23, 54)).
when().
       get("/lotto");

我可以验证奖品是 500 和 100000,但我无法验证获胜者 ID=23 的奖品=500 和获胜者Id=54 的奖品=100000。响应将显示获胜者Id=23,奖励=100000,测试将通过。

我不能使用contains(),因为数组中的元素可以以任意顺序出现,所以我需要使用containsInAnyOrder()

【问题讨论】:

    标签: java testing hamcrest rest-assured


    【解决方案1】:

    据我所知,Rest-Assured 只允许验证直接价值验证。对于条件验证,您必须改用 jsonpath:

    $.lotto.winners.[?(@.winnerId==23)].prize
    

    上面的jsonpath在lotto下搜索winners数组,选择有winnerId==23的数组项,然后取出奖品;

    expect().
             body("$.lotto.winners.[?(@.winnerId==23)].prize", equalTo(5000)).
    when().
           get("/lotto");
    

    SO 中还有其他可以参考的帖子是herehere

    试试这个link中的表达式

    JsonPath 表达式语法可以参考here

    【讨论】:

      【解决方案2】:

      使用 hamcrest,注意事项,获胜者列表中的一项被视为地图。

      @Test
      void test() {
      
          expect()
                  .body("lotto.lottoId", equalTo(5))
                  .body("lotto.winners.", allOf(
                          hasWinner(23, 5000),
                          hasWinner(54, 100000)
                  ))
                  .when()
                  .get("/lotto");
      }
      
      private Matcher<Iterable<? super Map<? extends String, ? extends Integer>>> hasWinner(int winnerId, int prize) {
          return hasItem(allOf(
                  hasEntry(equalTo("winnerId"), equalTo(winnerId)),
                  hasEntry(equalTo("prize"), equalTo(prize))
          ));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-12-29
        • 2019-03-10
        • 2016-08-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多