POST请求失败(放心测试)
POST request fails (rest-assured test)
我无法放心地提出 POST 请求。
此代码有效:
given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").
when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal));
但我曾尝试使用 param()
或 parameter()
方法:
这个给出:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().statusCode(200);
Expected status code <200> doesn't match actual status code <415>.
这个:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
java.lang.IllegalStateException: Expected response body to be verified as JSON, HTML or XML but no content-type was defined in the response.
Try registering a default parser using:
RestAssured.defaultParser(<parser type>);
还有这个:
RestAssured.defaultParser = Parser.JSON;
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
java.lang.IllegalArgumentException: The JSON input text should neither be null nor empty
我 运行 不知道有什么问题。
我想做的是避免为所有测试编写完整的 json,如果我可以跳过所有 "" 和 {} 会更快。
我的方法正确吗?
让我们看看你的第一个例子:
given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").
when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal));
这里发生的是您将 { "key" : "val" }
(作为文本)放入请求的 body 中。这段文字恰好是 JSON。从 REST Assured 的角度来看,您也可以输入无效的 { "key" : "val"
JSON。您的服务器响应正确,因为 服务器 需要并理解 JSON。它理解 body 应该是 JSON 因为你将 JSON 作为 content-type.
传递
让我们看看你的第二个例子:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().statusCode(200);
这是您的服务 returns 415,因为您缺少 JSON content-type。当您将 param
或 parameter
与 POST
一起使用时,您会创建表单参数。表单参数也在请求中发送 body 但表单参数不是 JSON!像您一样指定 "key" 和 "val" 作为表单参数将与此相同:
given().contentType("x-www-form-urlencoded").body("key=val").when().url + resource).then().assertThat().statusCode(200);
所以在你的第二个例子中实际上有两个问题:
- 您没有发送 JSON
- 你打错了content-type
并且因为 (2) 你从服务器得到 415
继续你的第三个例子:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
这里(可能)发生的是您的服务器不包含响应 body,因为它希望请求包含 "application/json" 作为 content-type。所以没有body断言(请求错误)!响应仅包含 415 状态(行)作为 header.
这将我们引向您的最后一个示例:
RestAssured.defaultParser = Parser.JSON;
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
在这里您指示 REST Assured 将丢失的 content-type 视为 JSON 但问题(再次)是您的服务器没有 return 任何响应 body根本无济于事。
解法:
您应该在您的类路径(例如 jackson-databind
)中放置一个受支持的 JSON object-mapping 框架(Jackson、Faster Jackson、Simple JSON 或 Gson)并且按照 documentation:
中的说明创建地图
Map<String, Object> jsonAsMap = new HashMap<>();
map.put("key", "val");
given().
contentType(ContentType.JSON).
body(jsonAsMap).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
由于在 Java 中创建地图非常冗长,如果我有嵌套地图,我通常会这样做:
given().
contentType(ContentType.JSON).
body(new HashMap<String,Object>() {{
put("key1, "val1");
put("key2, "val2");
put("key3", asList("val3", "val4"));
put("nested", new HashMap<String,String>() {{
put("key4", "val4");
put("key5", "val5");
}});
}}).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
或者您创建数据的 DTO 表示,然后将 object 传递给 REST Assured:
MyDTO myDTO = new MyDTO(...);
given().
contentType(ContentType.JSON).
body(myDTO).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
您可以在 object-mapping documentation 阅读更多内容。
我一直在寻找答案,我也想通了..
将文件添加到您的 src/test/resouces 文件夹并将此代码添加到您的测试中。应该都不错
URL file = Resources.getResource("ModyNewFieldsReq.json");
String myRequest = Resources.toString(file,Charsets.UTF_8);
Response fieldResponse = given ()
.header("Authorization", AuthrztionValue)
.header("X-App-Client-Id", XappClintIDvalue)
.contentType("application/vnd.api+json")
.body(myRequest).with()
.when()
.post(dataPostUrl)
.then()
.assertThat()
.log().ifError()
.statusCode(200)
.extract().response();
Assert.assertFalse(fieldResponse.asString().contains("isError"));
我无法放心地提出 POST 请求。
此代码有效:
given().contentType(ContentType.JSON).body("{\"key\": \"val\"}").
when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal));
但我曾尝试使用 param()
或 parameter()
方法:
这个给出:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().statusCode(200);
Expected status code <200> doesn't match actual status code <415>.
这个:
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
java.lang.IllegalStateException: Expected response body to be verified as JSON, HTML or XML but no content-type was defined in the response.
Try registering a default parser using:
RestAssured.defaultParser(<parser type>);
还有这个:
RestAssured.defaultParser = Parser.JSON;
given().parameter("key", "val").
when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
java.lang.IllegalArgumentException: The JSON input text should neither be null nor empty
我 运行 不知道有什么问题。
我想做的是避免为所有测试编写完整的 json,如果我可以跳过所有 "" 和 {} 会更快。 我的方法正确吗?
让我们看看你的第一个例子:
given().contentType(ContentType.JSON).body("{\"key\": \"val\"}"). when().post(url + resource).then().assertThat().statusCode(200).body("otherVal", equalTo(otherVal));
这里发生的是您将 { "key" : "val" }
(作为文本)放入请求的 body 中。这段文字恰好是 JSON。从 REST Assured 的角度来看,您也可以输入无效的 { "key" : "val"
JSON。您的服务器响应正确,因为 服务器 需要并理解 JSON。它理解 body 应该是 JSON 因为你将 JSON 作为 content-type.
让我们看看你的第二个例子:
given().parameter("key", "val"). when().post(url + resource).then().assertThat().statusCode(200);
这是您的服务 returns 415,因为您缺少 JSON content-type。当您将 param
或 parameter
与 POST
一起使用时,您会创建表单参数。表单参数也在请求中发送 body 但表单参数不是 JSON!像您一样指定 "key" 和 "val" 作为表单参数将与此相同:
given().contentType("x-www-form-urlencoded").body("key=val").when().url + resource).then().assertThat().statusCode(200);
所以在你的第二个例子中实际上有两个问题:
- 您没有发送 JSON
- 你打错了content-type
并且因为 (2) 你从服务器得到 415
继续你的第三个例子:
given().parameter("key", "val"). when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
这里(可能)发生的是您的服务器不包含响应 body,因为它希望请求包含 "application/json" 作为 content-type。所以没有body断言(请求错误)!响应仅包含 415 状态(行)作为 header.
这将我们引向您的最后一个示例:
RestAssured.defaultParser = Parser.JSON; given().parameter("key", "val"). when().post(url + resource).then().assertThat().body("otherVal", equalTo(otherVal));
在这里您指示 REST Assured 将丢失的 content-type 视为 JSON 但问题(再次)是您的服务器没有 return 任何响应 body根本无济于事。
解法:
您应该在您的类路径(例如 jackson-databind
)中放置一个受支持的 JSON object-mapping 框架(Jackson、Faster Jackson、Simple JSON 或 Gson)并且按照 documentation:
Map<String, Object> jsonAsMap = new HashMap<>();
map.put("key", "val");
given().
contentType(ContentType.JSON).
body(jsonAsMap).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
由于在 Java 中创建地图非常冗长,如果我有嵌套地图,我通常会这样做:
given().
contentType(ContentType.JSON).
body(new HashMap<String,Object>() {{
put("key1, "val1");
put("key2, "val2");
put("key3", asList("val3", "val4"));
put("nested", new HashMap<String,String>() {{
put("key4", "val4");
put("key5", "val5");
}});
}}).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
或者您创建数据的 DTO 表示,然后将 object 传递给 REST Assured:
MyDTO myDTO = new MyDTO(...);
given().
contentType(ContentType.JSON).
body(myDTO).
when().
post(url + resource).
then().
statusCode(200).
body("otherVal", equalTo(otherVal));
您可以在 object-mapping documentation 阅读更多内容。
我一直在寻找答案,我也想通了..
将文件添加到您的 src/test/resouces 文件夹并将此代码添加到您的测试中。应该都不错
URL file = Resources.getResource("ModyNewFieldsReq.json");
String myRequest = Resources.toString(file,Charsets.UTF_8);
Response fieldResponse = given ()
.header("Authorization", AuthrztionValue)
.header("X-App-Client-Id", XappClintIDvalue)
.contentType("application/vnd.api+json")
.body(myRequest).with()
.when()
.post(dataPostUrl)
.then()
.assertThat()
.log().ifError()
.statusCode(200)
.extract().response();
Assert.assertFalse(fieldResponse.asString().contains("isError"));