【问题标题】:Multiple matches assertion in JSON via RestAssured通过 RestAssured 在 JSON 中的多个匹配断言
【发布时间】:2020-04-20 07:32:54
【问题描述】:

我有几个 JSON 对象作为响应,每个对象都包含特定的 id。

{
"data": [{
        "id": 1,
        "status": {
            "id": 0
        }
    },
    {
        "id": 2,
        "status": {
            "id": 0
        }
    },
    {
        "id": 3,
        "status": {
            "id": 0
        }

    }
]

}

我需要测试每个data.status.id 都有一定的价值:

    then().
        spec(basicResponse).
        body("data.status.id", equalTo(0));

但是equalTo 匹配器一次将预期值与找到的 id 的整个列表相比较。不是每个人都单独找到 id。

java.lang.AssertionError: 1 expectation failed.
JSON path data.status.id doesn't match.
Expected: 0
  Actual: [0, 0, 0]

如何在不将响应数据提取到 List 的情况下对其进行测试,然后通过 foreach 或类似的方式对其进行检查?

int statusNeeded = 0;
            List<int> idsList = given().
                     get(Endpoints.GetCampaigns).
                 then().
                     extract().body().jsonPath().getList("data.status.id");

    for (int statusId: idsList)
    if(!statusNeeded.equals(statusId)) Assert.fail("Some id is not " + statusNeeded);

【问题讨论】:

  • 您是否需要验证状态 ID 是否具有某个值,或者您是否需要验证它不应为 0 以外的任何其他值?
  • 其次,我需要验证每个状态ID都有0值。

标签: java rest-assured matcher hamcrest rest-assured-jsonpath


【解决方案1】:

您可以按照以下方法进行

String res = given().when().get("http://localhost:3000/posts/CtQy1bt").then().log().all().extract().response().asString();

JsonPath js = new JsonPath(res);

int Count = js.get("data.size()");

for (int i=0;i<Count;i++) {
    int value = js.get("data["+i+"].status.id");
    Assert.assertEquals(value, 0);
}

我这里使用了JsonPath,并使用了for循环来遍历data[].status.id的数组。

根据您的要求将其断言为 0 的预期值

如果 status.id 的值不为 0,则断言将失败 - 示例如下

{
    "data": [
        {
            "id": 1,
            "status": {
                "id": 0
            }
        },
        {
            "id": 2,
            "status": {
                "id": 5
            }
        },
        {
            "id": 3,
            "status": {
                "id": 0
            }
        }
    ],
    "id": "nmBlS8t"
}
Exception in thread "main" java.lang.AssertionError: expected [0] but found [5]
    at org.testng.Assert.fail(Assert.java:97)
    at org.testng.Assert.assertEqualsImpl(Assert.java:136)
    at org.testng.Assert.assertEquals(Assert.java:118)
    at org.testng.Assert.assertEquals(Assert.java:839)
    at org.testng.Assert.assertEquals(Assert.java:849)
    at Stack5.main(Stack5.java:25)

【讨论】:

  • 是的,它成功了。但是,与我在问题底部通过使用 foreach 建议的方法相比,您确定这种方法执行起来更快吗?
  • 您似乎注意到了不同之处吗?这种方法将遍历键值,但我认为速度的概念在这里并不重要
【解决方案2】:

很遗憾,您没有进一步描述 JSON 输出的结构。所以,我不得不猜测。为什么不试试呢?

$.data[0].status.id

【讨论】:

  • 在您的更新中,存在不匹配。查看您的 JSON 文档,我认为您的测试输出应该是 Actual: [0, 1, 0]。对吗?
  • 是的,你是对的。抱歉,我不专心,更新后忘记编辑部分问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多