接口自动化测试利器,使用Rest Assured进行REST API测试

news2025/2/22 18:22:34

我们在做接口测试时,一般在代码中会使用HttpClient,但是HttpClient相对来讲还是比较麻烦的,代码量也相对较多,对于新手而言上手会比较难一点,今天我们来看下另一个接口测试工具包REST Assured

REST Assured是一个流行的Java库,用于测试RESTful Web服务。它提供了简单但强大的DSL(域特定语言)来验证REST服务的行为。

它完全支持所有REST方法,如GET、PUT、POST、PATCH等,可以说是接口自动化测试的利器。

引入 Rest Assured 依赖

<dependency>
      <groupId>io.rest-assured</groupId>
      <artifactId>rest-assured</artifactId>
      <version>5.4.0</version>
      <scope>test</scope>
</dependency>

编写Rest API测试

1.引入rest-assured依赖

2.编写代码

import io.restassured.RestAssured;
import io.restassured.http.Method;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;

/**
 * @author 作者:测试工程师成长之路
 * @version 创建时间:2023/12/24
 * 类说明:Rest Assured 示例代码
 */
public class RestAssuredAPITest {
    @Test
    public void GetBooksDetails() {
        // 指定请求的url 
        RestAssured.baseURI = "https://127.0.0.1/TesterRoad/Books";

        // 获取要发送到服务器的请求的RequestSpecification 
        RequestSpecification httpRequest = RestAssured.given();

        // 指定请求类型和请求报文
        Response response = httpRequest.request(Method.GET, "");
        // 输出接口响应报文和状态
        System.out.println("Status received => " + response.getStatusLine());
        System.out.println("Response=>" + response.prettyPrint());
    }
}

相关 API 说明

RestAssured.baseURI = "https://127.0.0.1/TesterRoad/Books";

上面的代码使用RestAssured类来设置一个基本URI。

在本例中,基本URI是https://127.0.0.1/TesterRoad/Books。

RequestSpecification httpRequest = RestAssured.given();

获取要发送到服务器的请求的RequestSpecification,Rest Assured库为此提供了一个名为RequestSpecification的接口。

变量httpRequest存储请求,以便我们可以在需要时修改它,例如添加身份验证,添加头等。

Response response = httpRequest.request(Method.GET, "");

调用服务器来使用RequestSpecification对象获取资源,上面的代码使用request方法向服务器发送对资源的请求。

request方法有两个参数,第一个是HTTP请求方法,第二个是字符串。字符串参数用于指定要与基URI一起发送的参数。在本例中,因为不需要任何参数,因此为空字符串。

请求方法的返回类型是Response对象,这意味着请求方法从服务器获取响应。

System.out.println("Status received => " + response.getStatusLine()); 
System.out.println("Response=>" + response.prettyPrint());

在上面的代码中,我们只是将响应作为字符串读取并将其打印到控制台。我们使用Response接口的getBody方法来返回响应的实际主体,然后将其打印到控制台。

我们还可以使用Rest Assured提供的简写方法来重构上述测试代码。

import io.restassured.RestAssured;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.junit.Test;


/**
 * @author 作者:测试工程师成长之路
 * @version 创建时间:2023/12/24
 * 类说明:Rest Assured 示例代码
 */
public class RestAssuredAPITest {

    @Test
    public void GetBooksDetails() {

        // 指定请求的url
        RestAssured.baseURI = "https://demoqa.com/BookStore/v1/Books";
        // 获取要发送到服务器的请求的RequestSpecification
        RequestSpecification httpRequest = RestAssured.given();
        // 指定请求类型和请求报文
        Response response = httpRequest.get("");
        // 输出接口响应报文和状态
        System.out.println("Response Body is =>  " + response.asString());
    }
}

断言响应状态码和获取响应头信息

1.验证HTTP响应状态码

int statusCode = response.getStatusCode();
System.out.println("statusCode => "+statusCode);
// 断言HTTP响应状态
Assert.assertEquals(statusCode , 200);

上述代码将返回值statusCode与预期值(即200)进行断言

在这里插入图片描述

2.获取头信息

// 获取HTTP响应头
Headers allHeaders = response.headers();
for(Header header : allHeaders) {
    System.out.println("Key: " + header.getName() + ",Value: " + header.getValue());
}

在上面的代码中,我们访问了所有的头信息,然后通过遍历Headers集合来提取单个头。

图片

3.获取指定的头信息

// 获取指定的头信息,如 Content-Type
String contentType = response.header("Content-Type");
System.out.println("Content-Type => " + contentType);
// 输出
Content-Type => application/json; charset=utf-8

上述代码使用header(String arg0)方法来获取特定的header。

使用JsonPath处理响应报文

图片

上图为接口响应报文

// books节点是一个数组
// 使用 JsonPath 获取指定字段,此处用于获取第一个pages
JsonPath jsonPath = response.jsonPath();
System.out.println("books第一个节点的pages => "+jsonPath.get("books[0].pages"));
// 输出
books第一个节点的pages => 234

全部代码

1.pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>org.example</groupId>
    <artifactId>rest-assured</artifactId>
    <version>1.0-SNAPSHOT</version>

    <properties>
        <maven.compiler.source>8</maven.compiler.source>
        <maven.compiler.target>8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
            <version>5.4.0</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>

    </dependencies>
</project>

2.示例代码

import io.restassured.RestAssured;
import io.restassured.http.Header;
import io.restassured.http.Headers;
import io.restassured.path.json.JsonPath;
import io.restassured.response.Response;
import io.restassured.specification.RequestSpecification;
import org.junit.Assert;
import org.junit.Test;

/**
 * @author 作者:测试工程师成长之路
 * @version 创建时间:2023/12/24
 * 类说明:Rest Assured 示例代码
 */
public class RestAssuredAPITest {

    @Test
    public void GetBooksDetails() {

        // 指定请求的url
        RestAssured.baseURI = "https://127.0.0.1/TesterRoad/Books";
        // 获取要发送到服务器的请求的RequestSpecification
        RequestSpecification httpRequest = RestAssured.given();
        // 指定请求类型和请求报文
        Response response = httpRequest.get("");
        // 输出接口响应报文和状态
        System.out.println("Response Body =>  " + response.asString());
        int statusCode = response.getStatusCode();
        System.out.println("statusCode => "+statusCode);
        // 断言HTTP响应状态
        Assert.assertEquals(statusCode , 200);
        // 获取HTTP响应头
        Headers allHeaders = response.headers();
        for(Header header : allHeaders) {
            System.out.println("Key: " + header.getName() + ",Value: " + header.getValue());
        }
        // 获取指定的头信息,如 Content-Type
        String contentType = response.header("Content-Type");
        System.out.println("Content-Type => " + contentType);
        // books节点是一个数组
        // 使用 JsonPath 获取指定字段,此处用于获取第一个pages
        JsonPath jsonPath = response.jsonPath();
        System.out.println("books第一个节点的pages => "+jsonPath.get("books[0].pages"));
    }
}

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


 

这些资料,对于【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴上万个测试工程师们走过最艰难的路程,希望也能帮助到你!有需要的小伙伴可以点击下方小卡片领取   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076437.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Blazor官方文档学习记录

Blazor官方文档学习记录 1 官方文档2 Blazor教程-生成首个应用3 项目结构4 基础知识4.1 生态4.2 Razor组件指令顺序4.3 Razor组件的初始化方法 5 注意 1 官方文档 https://dotnet.microsoft.com/zh-cn/apps/aspnet/web-apps/blazor2 Blazor教程-生成首个应用 https://dotnet.…

Python | Linux | 解析Himawari-8/9 | Standard Data

写作前面 之前一个相关的工作需要解析Himawari-8/9 Standard Data文件&#xff0c;因为他是二进制的&#xff0c;之前没有处理过&#xff0c;导致完全摸不着头脑。在网上找了中英文搜索找了好久&#xff0c;虽然也找到了公开的解析代码&#xff0c;但是放在自己的数据这感觉总是…

趣味算法------猴子吃桃(循环,递归双重解法)

题目描述 猴子第一天摘下若干个桃子&#xff0c;当天吃了一半&#xff0c;后面又多吃一个。第二天早上又将剩下的桃子吃掉一半&#xff0c;又多吃了一个。后面每天猴子都吃了前一天剩下的一半零一个。到第十天想再吃时&#xff0c;只剩下一个桃子。求第一天共摘了多少桃子。 …

鸿蒙(API 12 Beta3版)【获取音视频元数据】音频播放与录制

使用AVMetadataExtractor可以实现从原始媒体资源中获取元数据&#xff0c;本开发指导将以获取一个音频资源的元数据作为示例&#xff0c;向开发者讲解AVMetadataExtractor元数据相关功能。视频资源的元数据获取流程与音频类似&#xff0c;由于视频没有专辑封面&#xff0c;所以…

【中仕公考怎么样】公务员备考小建议

2025年国考在即&#xff0c;掌握正确的备考方法很重要&#xff01;中仕为大家简单分享4点小技巧。 1. 在提升行测分数时&#xff0c;可以采用大量的练习题、整理题以及关注往年核心考点的方式。无论处于准备过程的哪一阶段&#xff0c;对各类题型进行深入分析并掌握相应的解题…

C++ | Leetcode C++题解之第373题查找和最小的K对数字

题目&#xff1a; 题解&#xff1a; class Solution { public:vector<vector<int>> kSmallestPairs(vector<int>& nums1, vector<int>& nums2, int k) {int m nums1.size();int n nums2.size();auto count [&](int target){long long …

怎么用AI生成PPT演讲稿?5个方法教你快速生成

想象一下&#xff0c;你正在准备一场关于“墨西哥是如何走到今天这一步的”演讲&#xff0c;而你却苦于如何将复杂的历史背景、经济变迁以及文化特色等内容有机地整合进一份PPT中。 这时候&#xff0c;一款好的AI自动生成PPT的工具就能派上用场了。它不仅能够帮助你快速构建起…

C# 使用 WinForm MDI 模式管理多个子窗体程序的详细步骤

前言 嗨&#xff0c;各位码农们&#xff01;今天我们要来聊聊如何在 C# 的 WinForms 应用程序中用 MDI&#xff08;Multiple Document Interface&#xff09;模式来优雅地管理多个子窗体。 如果你曾经对着一堆乱七八糟的窗体不知所措&#xff0c;或者想要让你的应用程序看起来…

基于SpringBoot的线上教学平台系统

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言 Java 数据库 MySQL 技术 SpringBoot框架&#xff0c;Java语言 工具 IDEA/Eclipse、Navicat、Maven 系统展示 首页 管理员功能模块 学员功能模块 前台首页…

16行为型设计模式——策略模式

一、策略模式简介 策略模式&#xff08;Strategy Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一系列的算法&#xff0c;将每一个算法封装起来&#xff0c;并使它们可以相互替换。具体的算法选择交由客户端决定&#xff0c;即不同的算法可以在运行时动态地&a…

后端微服务架构:构建分布式博客系统

后端微服务架构&#xff1a;构建分布式博客系统 在当今的软件开发领域&#xff0c;微服务架构已经成为构建可扩展、灵活且易于维护的应用程序的主流选择。本文将探讨如何利用微服务架构来设计和实现一个分布式的博客系统。 1. 微服务架构简介 微服务架构是一种将应用程序分解…

练习题 期望dp

题目 分析&#xff1a; 首先注意到期望有线性性&#xff1a; E ( a b ) E ( a ) E ( b ) E(ab)E(a)E(b) E(ab)E(a)E(b)&#xff0c;其中 a a a、 b b b不要求相互独立。 因为网上很多地方的证明不严谨&#xff0c;所以这里证明一下&#xff1a; E ( a b ) ∑ i i ⋅ P …

C语言基础(十八)

1、共用体&#xff08;Union&#xff09;是一种特殊的数据类型&#xff0c;也被称为联合体&#xff0c;它允许在相同的内存位置存储不同的数据类型&#xff0c;每次只能存储其中一种类型的值。共用体是一种数据结构&#xff0c;多个不同类型的变量能够共享同一段内存空间。在C语…

OpenAI推出新功能:GPT-4o正式上线微调功能,限时免费!

GPT-4o正式上线微调功能&#xff0c;限时免费&#xff01; 每个组织每天可以免费获得多达100万个训练token&#xff0c;活动将持续到9月23日。 这意味着开发者们现在可以利用自定义数据集对GPT-4o进行微调&#xff0c;从而以较低的成本构建自己的应用程序。 据悉&#xff0c;G…

推荐3款在Windows系统上运行流畅、音质出众的音乐播放器

foobar2000 Foobar2000是一款由原Winamp开发公司的Peter Pawlowski开发的免费多功能音频播放器&#xff0c;具有高度定制化和丰富的功能。它支持多种音频格式&#xff0c;包括MP3、AAC、WMA、FLAC、WAV等&#xff0c;并且可以进行音频转码和格式转换。此外&#xff0c;Foobar20…

C盘满了,如何清理C盘

目录 磁盘清理删除休眠文件查看系统盘的存储占比卸载掉安装在系统盘的软件更改临时文件、文档等的存储位置 磁盘清理 选择自己的系统盘&#xff0c;我的是G盘。清理系统文件删除休眠文件 删除休眠文件 管理员打开cmd powercfg -h off 直接减少几个g的C盘占用 查看系统盘的存储…

世媒讯海外发稿:全球知名的中文媒体平台

新闻媒体网站专注于媒体行业中各类新闻的网站&#xff0c;也是网友最爱访问的网站类型之一。以下是一些知名的中文媒体平台&#xff0c;它们不仅提供华文内容&#xff0c;还具有较高的访问量和影响力。以下是十大可发布中文新闻稿的知名媒体&#xff0c;包括其月访问量、地区排…

【连续4届EI稳定检索】第五届计算机工程与智能控制学术会议(ICCEIC 2024,10月11-13)

第五届计算机工程与智能控制学术会议&#xff08;ICCEIC 2024&#xff09;将于2024年10月11日至13日在广州举办&#xff0c;聚焦计算机工程与智能控制前沿&#xff0c;涵盖网络安全、硬件系统、软件工程、嵌入式创新等多个核心议题及交叉学科研究。 ICCEIC 2024将计算机工程和智…

QT 程序直接崩溃The program has unexpectedly finished.

QT报错比较难处理&#xff0c;因为给出的控制台输出太宽泛甚至没有信息。 遇到当遇到这种直接崩溃的&#xff0c;试着把一些代码注释掉&#xff0c;慢慢试出出错的位置 。 这里有一种可能的原因是因为有些变量没有初始化&#xff0c;就直接使用。 如下图&#xff1a; 当我运…

【Java】/* 二叉树 - 底层实现*/

一、前序遍历 - 递归 /* 1. 前序遍历 - 递归 */public void preOrder(TreeNode root) {//1. 如果根节点为nullif (root null) {return;}//本意&#xff1a;打印树的根&#xff0c;左&#xff0c;右节点//2. 打印根节点的值System.out.print(root.val " ");//3. 如…