Skip to content

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 响应