当前位置:网站首页>技术分享 | 接口自动化测试中如何对xml 格式做断言验证?
技术分享 | 接口自动化测试中如何对xml 格式做断言验证?
2022-08-02 22:03:00 【测试界的飘柔】
在服务端自动化测试过程中,发起请求之后还需要对响应值进行验证,验证响应信息符合预期值之后,这一条接口自动化测试用例才算完整的通过。所以这一章节,将会讲解在接口自动化测试中,是如何对服务端返回的 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>
最后: 可以在公众号:伤心的辣条 ! 自行领取一份216页软件测试工程师面试宝典文档资料【免费的】。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。
现在我邀请你进入我们的软件测试学习交流群:【746506216】,备注“入群”, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路。
喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!
软件测试工程师自学教程:
这才是2022最精细的自动化测试自学教程,我把它刷了无数遍才上岸字节跳动,做到涨薪20K【值得自学软件测试的人刷】
软件测试工程师月薪2W以上薪资必学技能 — Python接口自动化框架封装.
美团面试真题_高级测试25K岗位面试 — 软件测试人都应该看看
软件测试必会_Jmeter大厂实战 — 仅6步可实现接口自动化测试

边栏推荐
猜你喜欢

MySql查询某个时间段内的数据(前一周、前三个月、前一年等)

Sentinel vs Hystrix 限流对比,到底怎么选?

牛客每日刷题之链表

最近公共祖先(LCA)学习笔记 | P3379 【模板】最近公共祖先(LCA)题解

Flink优化的方方面面

【STM32学习2】存储器相关概念与操作

How many ways do you know the singleton pattern?

2022-08-02 第六小组 瞒春 学习笔记

Finally understand: With threads, why do we need coroutines?

kubernetes pod podsecurityPolicies(PSP)
随机推荐
执子手,到永恒
【使用pyside2遇到的问题】This application failed to start because no Qt platform plugin could be initialized.
Do you understand the factory pattern?
VS保存后Unity不刷新
CodeTON Round 2 A - D
word操作:单独调整英文字体
你离「TDengine 开发者大会」只差一条 SQL 语句!
双轴晶体中锥形折射的建模与应用
JS 包装类 Math对象 round max() min() random
ZCMU--5230: 排练方阵(C语言)
Ansible installation and configuration
How to seize the new trend of NFT, yuan|universe|universe?
学习Autodock分子对接
wallys/new product/WiFi6 MiniPCIe Module 2T2R 2×2.4GHz 2x5GHz MT7915 MT7975
B站回应“HR 称核心用户都是 Loser”:该面试官去年底已被劝退,会吸取教训加强管理
mysql根据多字段分组——group by带两个或多个参数
RuoYi-App启动教程
学习基因富集工具DAVID(3)
Interviewer: can you talk about optimistic locking and pessimistic locks
resubmit 渐进式防重复提交框架简介
