1.XML响应断言简介
在服务器接口自动化测试过程中,测试程序发起请求之后还需要对服务端的响应值进行验证。验证响应信息(值)
符合预期值,这一个接口自动化测试用例才算通过。下面将会讲解在接口自动化测试中,我们是如何对服务端返回的XML格式响应内容做断言验证的。
2.XML响应断言的环境准备
Python版本
安装request_xml
pip install requests_xml
Java版本
Rest-Assured 支持对XML进行断言。
3.XML解析方式
有3中XML解析方式
(1)DOM方式:它是文档对象模型,是W3C组织推荐的标准编程接口,它将XML数据在内存中解析成一颗树形。
(2)SAX方式:它是一个用于处理XML时间驱动的模型,它逐行扫描文档,一边扫描一边解析。SAX方式对于大型文档的解析拥有很大优势,尽管不是W3C标准,但它得到了用户的广泛认可。
(3)ElementTree方式:它相当于DOM方式来说拥有更好的性能,与SAX方式性能差不多,使用API解析XML文件也很方便。
4.实战演示
实战演示代码如下(Python版和Java版)。
(1)Python演示代码
1)XML响应断言
from requests_xml import XMLSession
#设置 session
session = XMLSession()
r = session.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
# 打印所有的内容
r.text
# links可以获取到响应中所有的链接地址
r.xml.links
# raw_xml返回字节形式的响应内容
r.xml.raw_xml
# text返回标签中的内容
r.xml.text
2)XPath断言
request_xml库也支持XPath表达式。通过XPath表达式获取系统中对应响应字段的数据,把取出来的数据放在result列表中,方便接口测试用例断言。
xpath()用法:
def xpath(self,selector:str, * ,first:bool = False,_encoding:str = None) ->
_XPath:
"""Given an XPath selector,returns a list of
:class:`Element <Element>` object or a single one.
:param selector:XPath Selector to use.
:param first: Whether or not to return just the first result.
:param _encoding:The encoding format.
"""
上面程序执行的关键点如下。
-
XPath解析。
-
selector:使用XPath表达式。
-
first:判断是否只返回第一个查找的结果。
-
xpath()方法:返回查找到的列表对象。
def test_xpath():
session = XMLSession()
r = session.get("https://www.na***.gov/rss/dyn/lg_image_of_the_day.rss")
#通过xpath获取所有link标签的内容
item = r.xml.xpath("//link")
result = []
for i in item:
#把获取的结果放进列表中
result.append(i.text)
#断言
assert 'http://www.na***.gov/' in result
XML解析
XML是一种结构化、层级化的数据格式,最适合体现XML文档的数据结构就是树。XML文档可以使用Python自带的xml.etree.ElementTree来解析。ElementTree可以将整个XML文档转化为树,ElementTree可与XML文档进行 “交互” (读取、写入、查找)。
测试程序获取服务端的响应内容之后,使用findall()方法,通过传入XPath表达式在响应内容中查找所需要的数据。
import xml.etree.ElementTree ET
#自己封装XML解析方法
session = XMLSession()
r = session.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
#获取响应内容
root = ET.fromstring(r.text)
#查找根元素
em = root.findall(".")
# print(item)
items = root.findall(".//link")
result = []
#遍历
for i in items:
result.append(i.text)
assert "http://www.nasa.gov/" in result
(2)Java演示代码
Java中调用body()方法获取服务端的响应内容,body()方法的第一个参数是XPath表达式,第二个参数接收期望结果。
import static io.restassured.RestAssured.*;
import static org.hamcrest.core.IsEqual.equalTo;
public class Requests{
public static void main(String[] args){
given()
.contentType("application/rss+xml;charset=utf-8").
when()
.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day_rss")
.then()
.body("rss.channel.item[0].link",
equalTo("http://www.nasa.gov/image-feature/mocha-swirls-in-jupiter-s-
turbulent-atmosphere"))
.log().all();
}
}
rss.channel.item[0].link这种类型的XPath表达式浅显易懂,就是根据XPath本身的层级一级一级进行定位。rss是其最外层的标签,然后依次是channel标签、item标签、link标签,其中同级item有多个标签,所以需要通过下标[0]定位到第一个item标签。通过这样的定位方式,可以获取到想要的响应内容 。
下面是获得的XML格式的响应内容。
<rss version="2.0" xml:base="http://www.nasa.gov/" xmlns:atom="http://www.w3.org/
2005/Atom" xmlns:dc="http://pu***.org/dc/elements/1.1/" xmlns:itunes="http://
www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yah***.com/mrss/">
<channel>
<item>
<title>Mocha Swirls in Jupiter's Turbulent Atmosphere</title>
<link>http://www.nasa.gov/image-feature-feature/mocha-swirls-in-jupiter-s-
turbulent-atmosphere</link>
//省略
</item>
//省略
<item>
//省略
</item>
</channel>
</rss>