Rest_Assured接口测试-响应体处理:
日常测试中,不同的接口返回的body体不同,有的是返回json格式,有的是返回xml格式,对于断言来说增加了代码量,因此想要统一处理响应体,将此方法封装为一个公共方法,减少冗余代码减少出错率提高效率
将响应体xml格式转换为json
大部分的响应结果都是json格式的,并且json格式的数据看起来更直观,为了方便处理,将xml格式数据转换为json格式再进行断言
下面方法为封装的xml转换为json的方法,先判断响应结果是否为xml,不是的话直接返回原来的响应数据,是xml的话,使用XmlMapper将传入的响应字符串结果读取为JsonNode ,并转换为String
//xml转换为json
public void String resToJson(String originRes) throws IOException {
//如果读取的内容不是xml的,会报错,因此要判断是否是xml
String res = "";
if (originRes.startsWith("<?xml")) {
XmlMapper xmlMapper = new XmlMapper();
JsonNode node = xmlMapper.readTree(originRes.getBytes());
ObjectMapper jsonMapper = new ObjectMapper();
res = jsonMapper.writeValueAsString(node);
} else {
res = originRes;
}
return res;
}
使用上面的方法来将响应xml转换为json
@Test
// 将返回的xml格式转换为json
void resToJsonTest() throws IOException {
String result = given()
.when()
.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
.then().log().all()
.extract().body().asString();
// 调用转换成json的方法
String res = resToJson(result);
//$..title 是jsonpath定位元素的方式,会查找到所有title,因为有多个title用list接收
List<String> titleList = JsonPath.read(res, "$..title");
assertEquals(titleList.get(0), "NASA Image of the Day");
}
很多时候我们并不知道响应的结果是xml还是json,因此上面封装的方法 既能用于响应体是xml的也能用于json的(如果不是xml的则直接返回了原来的数据)
@Test
//返回的数据是json
void respJson() {
try {
String res = given()
.when().get("https://httpbin.ceshiren.com/get")
.then().log().all()
.statusCode(200).extract().body().asString();
String result = resToJson(res);
String origin = JsonPath.read(result,"$.origin");
assertEquals("172.17.56.110",origin);
} catch (IOException e) {
throw new RuntimeException(e);
}
}