前面几个测试用例的响应内容都是JSON格式,现在来举例请求的响应内容是XML格式的数据如何解析,其实在Rest Assured中,JSPN和XML数据解析都是一样,通用的写法是xpath表示,具体我们来看两个XML响应的解析例子。
1.响应内容是单个XML数据
请求demo:http://www.thomas-bayer.com/sqlrest/CUSTOMER/10/
什么是xpath路径呢,不管在json还是xm都可以使用xpath路径,例如CUSTOMER.ID 就是一个xpath路径,下面我们代码中会用到,用来断言是不是等于10.
/**
* 测试响应内容是单个xml数据
*/
@Test
public void testSingleXMLContent() {
given().
get("http://www.thomas-bayer.com/sqlrest/CUSTOMER/10/").
then().
body("CUSTOMER.ID", equalTo("10")).
log().all();
}
这10要拿String类型去对比,如果是int类型就会匹配失败,所以我加上了“10”
再写一个用例,每个xml数据都去断言和校验。
/**
* 测试响应内容是单个xml数据,写多个断言点
*/
@Test
public void testSingleXMLContents() {
given().
get("http://www.thomas-bayer.com/sqlrest/CUSTOMER/10/").
then().
body("CUSTOMER.ID", equalTo("10")).
body("CUSTOMER.FIRSTNAME", equalTo("Sue")).
body("CUSTOMER.LASTNAME", equalTo("Fuller")).
body("CUSTOMER.STREET", equalTo("135 Upland Pl.")).
body("CUSTOMER.CITY", equalTo("Dallas")).
log().all();
}
这个断言检查点写法,我觉得实际工作中不怎么使用,除非是特别重要的数据。
2.多个验证点一行代码的写法
如果觉得上面多个body中校验点写法很啰嗦的话,其实还有一种方法可以简写成一行。看看下面例子。
/**
* 多个测试点一行代码去校验
*/
@Test
public void testCompleteTextinOneLine() {
given().
get("http://www.thomas-bayer.com/sqlrest/CUSTOMER/10/").
then().
body("CUSTOMER.text()", equalTo("10SueFuller135 Upland Pl.Dallas")).
log().all();
}
运行结果
[RemoteTestNG] detected TestNG version 6.14.3
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
Content-Type: application/xml
Date: Sun, 21 Jul 2019 07:19:58 GMT
Content-Length: 241
<CUSTOMER xmlns:xlink="http://www.w3.org/1999/xlink">
<ID>10</ID>
<FIRSTNAME>Sue</FIRSTNAME>
<LASTNAME>Fuller</LASTNAME>
<STREET>135 Upland Pl.</STREET>
<CITY>Dallas</CITY>
</CUSTOMER>
PASSED: testCompleteTextinOneLine
3.根据XPATH表达式查找值
/**
* find value by xpath
*/
@Test
public void findValueByXpath() {
given().
get("http://www.thomas-bayer.com/sqlrest/CUSTOMER/10/").
then().
body(hasXPath("/CUSTOMER/FIRSTNAME"), containsString("Sue"));
}
[RemoteTestNG] detected TestNG version 6.14.3
PASSED: findValueByXpath
4.再来一个xpath表达式使用场景
请求demo: http://www.thomas-bayer.com/sqlrest/INVOICE/
代码中使用XPATH定位表达式来确定/20/这个数据
下面代码来判断>20<, 这个20就是当前INVOICE节点的text的值。
/**
* find value by xpath, eg2
*/
@Test
public void findValueByXpath2() {
given().
get("http://www.thomas-bayer.com/sqlrest/INVOICE/").
then().
body(hasXPath("/INVOICEList/INVOICE[text()='20']")).
log().all();
}
当然这里使用了log().all()方法会把当前请求全部list内容都打印出来,上面判断条件只是,这里多响应内容中,有没有text()=20这条数据。
总结:
基于XML格式的响应还是比较少,现在基本上全部是JSON的格式。本篇了解一下,知道Rest Assured框架能够处理XML格式的响应就好。