1.XML 响应断言简介
在服务器接口自动化测试过程中,测试程序发起请求之后还需要对服务端的响应值进行验证。验证响应信息(值)
符合预期值,这一个接口自动化测试用例才算通过。下面将会讲解在接口自动化测试中,我们是如何对服务端返回的 XML 格式响应内容做断言验证的。
2.XML 响应断言的环境准备
Python 版本
安装 request_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>
复制代码
更多软件测试行业资讯可关注主页了解详情哦~
评论