xml响应断言
xml 响应断言
简介
XML
断言是针对于 XML
格式的数据,用于验证 XML
文档的结构和内容是否符合预期,以确保系统在运行过程中输出的数据是正确的。
应用场景
当响应数据以 xml
类型返回来的时候,需要进行转换才能去进行断言,
XML 解析方式
首先了解下 XML
的三种解析方式:
DOM 方式:它是文档对象模型,是 W3C 组织推荐的标准编程接口,它将 XML 数据在内存中解析成一颗树,通过对树进行操作。
SAX 方式:它是一个用于处理 XML 事件驱动的模型,它逐行扫描文档,一边扫描一边解析。SAX 方式对于大型文档的解析拥有很大优势,尽管不是 W3C 标准,但它却得到了广泛认可。
lementTree 方式:它相对于 DOM 来说拥有更好的性能,与 SAX 方式性能差不多,API 使用也很方便。
环境准备
Python:
- 安装 requests_xml
pip install requests_xml
XML 响应断言
from requests_xml import XMLSession
# 设置session
session = XMLSession()
url = "https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss"
r = session.get(url)
# 打印所有的内容
print(r.text)
# links可以拿到响应中所有的链接地址
print(r.xml.links)
# raw_xml返回字节形式的响应内容
print(r.xml.raw_xml)
# text返回标签中的内容
print(r.xml.text)
Java:
准备 pom.xml
文件,引入依赖:
<dependencies>
<!-- RestAssured RESTful API 测试框架 -->
<dependency>
<groupId>io.rest-assured</groupId>
<artifactId>rest-assured</artifactId>
<version>5.3.0</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
<scope>test</scope>
</dependency>
</dependencies>
import io.restassured.path.xml.XmlPath;
import io.restassured.response.Response;
import org.junit.jupiter.api.Test;
import java.util.List;
import static io.restassured.RestAssured.given;
public class TestXMLSession {
@Test
void testXMLSession() {
// 定义请求的URL
String url = "https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss";
// 发送请求并获取响应
Response response = given().when().get(url).then().extract().response();
// 打印所有的内容
System.out.println(response.getBody().asString());
// 使用XmlPath解析XML响应体
XmlPath xmlPath = new XmlPath(response.getBody().asString());
// 获取所有的链接地址
List<String> links = xmlPath.getList("rss.channel.item.link");
System.out.println("Links: " + links);
// raw_xml返回字节形式的响应内容
byte[] rawXml = response.getBody().asByteArray();
System.out.println("Raw XML: " + new String(rawXml));
// 获取文本内容
String textContent = xmlPath.getString("rss.channel.title");
System.out.println("Text: " + textContent);
}
}
XPath 断言
requests_xml
库也支持 XPath 表达式。通过 XPath 表达式取出对应响应中字段的数据,把取出来的数据放在 result 列表中,方便用例断言。
xpath() 用法:
Python:
def 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 all('https://www.nasa.gov/' in link for link in result)
##断言当前列表内是否包含了下方的链接
assert 'https://www.nasa.gov/image-detail/iss069e084548-lrg/' in result
xpath()
Java:
import io.restassured.path.xml.XmlPath;
import io.restassured.response.Response;
import org.junit.jupiter.api.Test;
import java.util.List;
import static io.restassured.RestAssured.given;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.everyItem;
import static org.hamcrest.Matchers.containsString;
import static org.hamcrest.Matchers.hasItem;
public class TestXPath {
@Test
void testXPath() {
// 发送请求并获取响应
Response response = given()
.when()
.get("https://www.nasa.gov/rss/dyn/lg_image_of_the_day.rss")
.then()
.extract()
.response();
// 解析XML响应体
XmlPath xmlPath = new XmlPath(response.getBody().asString());
// 通过XPath获取所有link标签的内容
List<String> items = xmlPath.getList("rss.channel.item.link");
System.out.println(items);
// 断言所有链接包含指定前缀
assertThat(items, everyItem(containsString("https://www.nasa.gov/")));
// 断言列表中包含指定链接
assertThat(items, hasItem("https://www.nasa.gov/image-detail/iss069e084548-lrg/"));
}
}
总结
- requests_xml 解析 xml 响应