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

在服务端自动化测试过程中,发起请求之后还需要对响应值进行验证,验证响应信息符合预期值之后,这一条接口自动化测试用例才算完整的通过。所以这一章节,将会讲解在接口自动化测试中,是如何对服务端返回的 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 标签。通过这样的定位方式,也可以获取到想要的响应内容。

下面是这次请求的 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>

最后感谢每一个认真阅读我文章的人,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走:

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值