JSON 中的多个匹配断言通过 RestAssured
Multiple matches assertion in JSON via RestAssured
我有几个 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);
不幸的是,您没有进一步描述 JSON 输出的结构。所以,我不得不猜测。你为什么不试试?
$.data[0].status.id
你可以按照下面的方法
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)
我有几个 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);
不幸的是,您没有进一步描述 JSON 输出的结构。所以,我不得不猜测。你为什么不试试?
$.data[0].status.id
你可以按照下面的方法
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)