Java 接口测试框架 Restassured

目录

接口测试框架Restassured介绍

市场上的主流的接口测试框架

  • Postman:提供了类似RestAssured的功能,包括请求发送、断言和响应处理等。
  • Apache HttpClient:一个用于发送HTTP请求的Java库,提供了更底层的控制和定制化。
  • JUnit:虽然JUnit主要用于单元测试,但它可以与RestAssured等库集成,用于编写针对API接口的集成测试。
  • MockMvc:是Spring框架下的一个模拟框架,用于模拟Web请求和响应

接口测试框架【Restassured】

  • 一个基于Java的轻量级接口测试框架,主要用于简化基于HTTP协议的接口测试,简单易用、功能强大、可扩展性好
  • 官网:http://rest-assured.io
  • 优点
    • 简单易用,RestAssured提供了简单易用的API,可以轻松地编写测试代码。
    • 功能强大,支持多种请求方法、断言和验证响应内容、状态码、响应时间等特性
    • 可扩展性好,RestAssured可以与TestNG、JUnit等测试框架完美集成
    • 支持多种数据格式处理,RestAssured可以处理JSON和XML格式的数据
    • 支持结构化解析和多种解析方式,支持xpath/jsonpath/gpath等解析方式
    • 对Spring的支持比较全面,方便使用Spring框架的开发者
  • 缺点
    • 依赖性强:RestAssured依赖于Java和HTTP协议,对于非Java或非HTTP协议的接口可能不太适用
    • 需要配置测试环境:在使用RestAssured进行接口自动化测试之前,需要搭建相应的测试环境,包括服务器、数据库等。
    • 非0基础上手:虽然RestAssured提供了简单易用的API,但对于初学者来说,仍然需要一定的学习成本才能掌握。

SpringBoot3.X整合

xml 复制代码
		<dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured</artifactId>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>rest-assured-all</artifactId>
        </dependency>
        <dependency>
            <groupId>io.rest-assured</groupId>
            <artifactId>spring-web-test-client</artifactId>
        </dependency>

快速开始

  • given:设置测试预设,包括请求头、请求参数、请求体、cookie等
  • when:所要执行的操作,配置发起请求的网址(GET / POST 请求)
  • then:解析结果、断言
java 复制代码
@SpringBootTest
public class AssuredTest {

    @Test
    public void testBase() {
        RestAssured.given()
                .param("id", 1)
                .when()
                .get("http://127.0.0.1:8082/api/v1/test/detail")
                .then()
                .log()
                .all()
                .statusCode(200);
    }

}

Restassured框架常用方法

基础语法格式

  • RestAssured的语法采用简洁的链式调用方式
  • given()开始,设置测试预设,包括请求头、请求参数、请求体、cookie等;
  • 然后使用when()指定请求的URL(GET、POST等请求)
  • 最后使用then()进行断言和解析响应结果

参数配置

  • 请求头参数:使用header()方法设置请求头信息,例如"header("Content-Type", "application/json")"。
  • 请求参数
    • 对于GET请求,使用"param()"方法设置URL参数,例如"param("key", "value")";
    • 对于POST请求,可以使用"body()"方法设置请求体内容
  • 文件上传
    • 提供multiPart() 的方法可以指定文件(file)、字节数组(byte-array)、输入流或者是上传文件

示例

  • GET 请求
    • log()可以向控制台输出返回的信息
    • log().all() 可以返回所有响应中的数据
java 复制代码
 	@Test
    public void testBase() {
        RestAssured.given()
                .queryParam("id", 1)
                .when()
                .get("http://127.0.0.1:8082/api/v1/test/detail")
                .then()
                .log().all()
                .statusCode(200);
    }
  • POST方式form表单
java 复制代码
 	@Test
    public void testPostForm(){
        RestAssured.given()
                .formParam("mail", "1320801376@sina.com")
                .formParam("pwd","123456")
                .when()
                .post("http://127.0.0.1:8082/api/v1/test/login_form")
                .then()
                .log().all()
                .statusCode(200);
    }
  • POST方式json+header
java 复制代码
    @Test
    public void testPostJsonHeader(){
        Map<String,String> params = new HashMap<>();
        params.put("title","山海经传奇");
        RestAssured.given()
                .header("token","7a9b7dcbba2443c5a80fbfa62da63e69")
                //.header("Content-Type","application/json")
                .contentType(ContentType.JSON)
                .body(JsonUtil.obj2Json(params))
                .when()
                .post("http://127.0.0.1:8082/api/v1/test/buy")
                .then()
                .log()
                .all()
                .statusCode(200);
  • 文件上传
java 复制代码
    @Test
    public void testFile(){
        RestAssured.given()
                .multiPart(new File("/Users/xdclass/Desktop/测试jmx/id.csv"))
                .when()
                .post("http://127.0.0.1:8082/api/v1/test/upload")
                .then()
                .log().all()
                .statusCode(200);
    }

断言与解析

响应断言

  • 使用statusCode()方法指定期望的响应状态码,例如statusCode(200)
  • 还可以使用body()方法对响应内容进行断言,例如body("key", equalTo("value"))
类型 断言方法 含义
状态码 statusCode() 响应状态码
响应头 header() 响应头信息
内容 body() 内容匹配

内置结果解析

  • 自带GPath解析
    • 是来自groovy 编程语言的广泛使用的 XML 和 JSON 解析器 GPath可以处理html、xml、json
    • 跟JSONpath的区别就是不需要从$开始写了,GPATH直接从JSON消息的第一层数据开始
    • 通过 extract().response() 将响应结果保存到 Response 类型的变量,使用Gpath提取响应中的某一个具体的数据
      • 提取JSON:res.jsonPath().get("XXX.XXX.XXX");
      • 提取xml:res.xmlPath().get("XXX.XXX.XXX");
      • 提取HTML:res.htmlPath().get("XXX.XXX.XXX");
  • JSON解析
    • 支持对JSON格式的响应数据进行解析,可以使用jsonPath()方法指定JSON路径进行查询和断言。
  • XML解析
    • 支持对XML格式的响应数据进行解析,可以使用xmlPath()方法指定XML路径进行查询和断言。

示例

断言测试

java 复制代码
    @Test
    public void testAssert(){
        Map<String,String> params = new HashMap<>();
        params.put("title","山海经传奇");
        RestAssured.given()
                .header("token","7a9b7dcbba2443c5a80fbfa62da63e69")
                .header("Content-Type","application/json")
                .body(JsonUtil.obj2Json(params))
                .when()
                .post("http://127.0.0.1:8082/api/v1/test/buy")
                .then()
                .log()
                .all()
                .statusCode(200)
                .body("code", equalTo(1));
    }

结果解析

java 复制代码
    @Test
    public void testResponse(){
        Map<String,String> params = new HashMap<>();
        params.put("title","山海经传奇");
        Response response = RestAssured.given()
                .header("token", "7a9b7dcbba2443c5a80fbfa62da63e69")
                //.header("Content-Type","application/json")
                .contentType(ContentType.JSON)
                .body(JsonUtil.obj2Json(params))
                .log().headers()//打印请求头
                .log().body()//打印请求体
                .when()
                .post("http://127.0.0.1:8082/api/v1/test/buy")
                .then()
                .log()
                .all()
                .statusCode(200).extract().response();

        Object data = response.jsonPath().get("data");
        System.out.println(data);
    }
相关推荐
wangbing11251 小时前
开发指南141-类和字节数组转换
java·服务器·前端
~央千澈~1 小时前
抖音弹幕游戏开发之第15集:添加配置文件·优雅草云桧·卓伊凡
java·前端·python
肖。35487870941 小时前
html中onclick误区,后续变量会更改怎么办?
android·java·javascript·css·html
郝学胜-神的一滴1 小时前
Effective Modern C++ 条款39:一次事件通信的优雅解决方案
开发语言·数据结构·c++·算法·多线程·并发
香芋Yu1 小时前
【从零构建AI Code终端系统】02 -- Bash 工具:一切能力的基础
开发语言·bash·agent·claude
码云数智-园园1 小时前
Java Swing 界面美化与 JPanel 优化完全指南:从复古到现代的视觉革命
java·开发语言
@atweiwei1 小时前
Rust 实现 LangChain
开发语言·算法·rust·langchain·llm·agent·rag
舟舟亢亢1 小时前
Java并发编程(下)
java·开发语言
Дерек的学习记录1 小时前
C++:类和对象part2
c语言·开发语言·c++·学习