写点什么

技术分享 | 接口自动化测试中如何对 xml 格式做断言验证?

  • 2022-10-12
    北京
  • 本文字数:2102 字

    阅读完需:约 7 分钟

本文节选自霍格沃兹测试开发学社内部教材


在服务端自动化测试过程中,发起请求之后还需要对响应值进行验证,验证响应信息符合预期值之后,这一条接口自动化测试用例才算完整的通过。所以这一章节,将会讲解在接口自动化测试中,是如何对服务端返回的 XML 格式响应内容做断言验证。


环境准备


Python 版本安装 requests_xml


pip install requests_xml


Java 版本 Rest-Assured 支持对 xml 进行断言,参考接口测试框架章节安装 Rest-Assured 即可。


Xml 解析方式


Python 有三种 XML 解析方式。


DOM 方式:它是文档对象模型,是 W3C 组织推荐的标准编程接口,它将 XML 数据在内存中解析成一个树,通过对树的操作来操作 XML。


SAX 方式:它是一个用于处理 XML 事件驱动的模型,它逐行扫描文档,一边扫描一边解析,对于大型文档的解析拥有巨大优势,尽管不是 W3C 标准,但它却得到了广泛认可。


ElementTree 方式:相对于 DOM 来说拥有更好的性能,与 SAX 性能差不多,API 使用也很方便。


Python 版本 request 对 XML 格式封装的不强,可以使用 request_xml 第三方库,或者也可以自己封装一个 XML 的解析。


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


使用 xpath 断言 requests_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> objects 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.  """
复制代码


selector: 使用的 XPath 表达式


first: 是否只返回第一个查找的结果


xpath() 方法会返回一个查找到的对象的列表。


def test_xpath():session = XMLSession()r = session.get("https://www.nasa.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.nasa.gov/' in result


XML 解析 XML 是一种结构化、层级化的数据格式,最适合体现 XML 的数据结构就是树。可以使用 python 自带的 xml.etree.ElementTree 来解析 XML 结构。ElementTree 可以将整个 XML 文档转化为树,对整个 XML 文档的交互(读取,写入,查找元素),一般是在 ElementTree 层面进行的。


然后再使用 findall 方法,去查找需要的 XPath 的数据。


import xml.etree.ElementTree as 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


Java 版本调用 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();


}
复制代码


}


下面是这次请求的 XML 响应内容,rss.channel.item[0].link 这种类型的 XPath 表达式浅显易懂,就是根据 XPath 本身的层级一级一级进行定位。rss 是其最外层的标签,然后依次是 channel 标签、item 标签、link 标签,其中同级 item 有多个标签,所以需要通过下标 [0] 定位到第一个 item 标签。通过这样的定位方式,也可以获取到想要的响应内容。


<rss version="2.0" xml:base="http://www.nasa.gov/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/"><channel><item><title>Mocha Swirls in Jupiter’s Turbulent Atmosphere</title><link>http://www.nasa.gov/image-feature/mocha-swirls-in-jupiter-s-turbulent-atmosphere</link>...省略</item>...省略<item>...省略...</item></channel></rss>


点击下方链接免费领取:性能测试+接口测试+自动化测试+测试开发+测试用例+简历模板+测试文档

http://qrcode.testing-studio.com/f?from=infoQ&url=https://ceshiren.com/t/topic/22265

用户头像

社区:ceshiren.com 微信:ceshiren2021 2019-10-23 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料,实时更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬。

评论

发布
暂无评论
技术分享 | 接口自动化测试中如何对xml 格式做断言验证?_霍格沃兹测试开发学社_InfoQ写作社区