如何放心验证数组内元素值的正确性

use*_*729 5 java testing hamcrest rest-assured

我正在尝试验证我的响应的某些属性,如放心教程中所示。

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

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

{
"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]
 }]
}
}
Run Code Online (Sandbox Code Playgroud)

我可以验证 WinnerIds 为 23 和 54

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

我可以验证奖金为 500 和 100000,但无法验证 WinnerId=23 的奖金=500,以及 WinnerId=54 的奖金=100000。响应将显示 WinnerId=23,奖品=100000,并且测试将通过。

我无法使用contains()因为数组中的元素可以按任何顺序出现,所以我需要使用containsInAnyOrder()

par*_*dak 4

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

$.lotto.winners.[?(@.winnerId==23)].prize
Run Code Online (Sandbox Code Playgroud)

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

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

SO 中还有其他帖子您可以参考这里这里

尝试此链接中的表达式

JsonPath 表达式语法可以在此处找到。