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
#设置 sessionsession = 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>
复制代码
更多软件测试行业资讯可关注主页了解详情哦~
评论