栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Rest-Assure框架最全使用教程

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Rest-Assure框架最全使用教程

一、概括:

一、简介:

  • 是由 Java 实现的 REST API 测试框架
  • 支持发起 POST,GET,PUT,DELETE 等请求
  • 可以用来验证和校对响应信息
  • 官网地址: http://rest-assured.io

二、优势

  • 简约的接口测试 DSL
  • 支持 xml/json 的结构化解析
  • 支持xpath/jsonpath/gpath解析方式
  • 对 spring 的支持比较全面
  • 符合契约编程思想

三、 环境准备

  • 基于 JDK 11、JUnit5
  • 创建 maven 项目
  • pom.xml 添加 rest-assured 的依赖

    io.rest-assured
    rest-assured
    4.4.0
    test

二、实战

一、新建一个测试类 TestRestAssured.java

import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;

public class TestRestAssured {

@Test
void fun(){

    given()
        // given 设置测试预设(请求头、请求参数、请求体等等)
        .header("Hello", "Hogwarts")
    .when()
        // when 所要执行的请求动作
        .get("https://httpbin.ceshiren.com/get")
    .then()
        // then 解析结果、断言
        .log().all();  // 打印全部响应信息(响应头、响应体、状态等等)
}

附录:JUnit5 依赖配置



    org.junit.platform
    junit-platform-launcher
    1.5.2
    test


    org.junit.jupiter
    junit-jupiter-engine
    5.5.2
    test


    org.junit.vintage
    junit-vintage-engine
    5.5.2
    test

二、接口请求构造

语法格式
given():可以设置测试预设
param():URL 查询参数 when():所要执行的操作
get():GET 请求
post():POST 请求
then():可以解析结果、断言
statusCode():响应状态码断言

  • get请求
import static io.restassured.RestAssured.given;
import org.junit.jupiter.api.Test;

public class TestRestAssuredGet {
    @Test
    void testGet(){
        given()
            // 可以设置测试预设
            .param("username", "Hogwarts")  // 设置查询参数
        .when()
            // 发起 GET 请求
            .get("https://httpbin.ceshiren.com/get")
        .then()
            // 解析结果
            .log().all()  // 打印完整响应信息
            .statusCode(200);  // 响应断言
    }
  • POST 请求
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;

public class TestRestAssuredPost {
    @Test
    void testPost(){
        given()
            // 可以设置测试预设
            .param("username", "Hogwarts")  // 设置查询参数
        .when()
            // 发起 POST 请求
            .post("https://httpbin.ceshiren.com/post")
        .then()
            // 解析结果
            .log().all()  // 打印完整响应信息
            .statusCode(200);  // 响应断言
    }
  • 请求参数

直接拼接在 URL 中
?username=Hogwarts&id=666
GET 请求
param():查询参数
POST 请求
queryParam():查询参数
formParam():表单参数

import static io.restassured.RestAssured.given;
import org.junit.jupiter.api.Test;

public class TestRestAssuredGet {
    @Test
    void testGet(){
        given()
            // 可以设置测试预设
            .param("username", "Hogwarts")  // 设置查询参数
        .when()
            // 发起 GET 请求
            .get("https://httpbin.ceshiren.com/get")
        .then()
            // 解析结果
            .log().all()  // 打印完整响应信息
            .statusCode(200);  // 响应断言

三、接口测试断言

  • 接口断言使用场景

问题: 如何确保请求可以发送成功 如何保证符合业务需求 解决方案: 响应断言

响应结果类型:

类型断言方法含义
状态码statusCode()响应状态码
响应头header()响应头信息
内容body()内容完全匹配
  • 简单断言: 响应状态码
import static io.restassured.RestAssured.given;
import org.junit.jupiter.api.Test;

public class TestAssertionStatusCode {
    @Test
    void testStatusCode(){
        given()
        .when()
                .get("https://httpbin.ceshiren.com/get")  // 发起GET请求
        .then()
                .log().all()  // 打印响应结果
                .statusCode(200);  // 响应状态码断言
  • 简单断言: 响应体
import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static org.hamcrest.core.IsEqual.equalTo;

public class TestAssertionBody {
    @Test
    void testBody(){
        given()
        .when()
            .get("https://httpbin.ceshiren.com/get")  // 发起GET请求
        .then()
            .log().all()  // 打印响应结果
            .body("origin", equalTo("113.89.246.184"));  // 响应体断言
    }
}
  • 复杂断言

提问:若碰到复杂断言应该如何处理?

  • jsonpath

  • jsonschema

  • 自行编写解析算法

  • 附录:Hamcrest 依赖配置


  org.hamcrest
  hamcrest-core
  1.3
  test


  org.hamcrest
  hamcrest-library
  1.3
  test

四、json/xml请求

  • json请求

1、简介

  • 是 JavaScript Object Notation 的缩写

  • 是一种轻量级的数据交换格式

  • 是理想的接口数据交换语言

  • 官网:https://www.json.org/json-en.html

2、json请求

1、构造 JSON 请求体

  • JSON 字符串
  • HashMap 对象 + Jackson库
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;

public class TestJsonStr {
    @Test
    void testJsonRequest(){
        // 定义请求体数据:json序列化后的字符串
        String jsonStr = "{"Hello2": "Hogwarts"}";

        given()
                .contentType("application/json")  // 设置请求内容类型
                .body(jsonStr)  // 设置请求体数据
                .log().headers()  // 打印请求头信息
                .log().body()  // 打印请求体信息
        .when()
                .post("https://httpbin.ceshiren.com/post")  // 发送请求
        .then()
                .statusCode(200);  // 响应状态码断言
  • 使用 HashMap 对象
import java.util.HashMap;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;

public class TestJsonObj {
    @Test
    void testJsonRequest(){

        // 定义请求体数据:HashMap 对象
        HashMap jsonObj = new HashMap<>();
        jsonObj.put("Hello", "Hogwarts");

        given()
                .contentType("application/json")  // 设置请求内容类型
                .body(jsonObj)  // 定制请求体数据
                .log().headers()  // 打印请求头信息
                .log().body()  // 打印请求体信息
        .when()
                .post("https://httpbin.ceshiren.com/post")  // 发送请求
        .then()
                .statusCode(200);  // 响应状态码断言
    }
}

2、XML

简介

  • 是 eXtensible Markup Language 的缩写
  • 是 可扩展标记语言,类似 HTML
  • 是用来传输和存储数据
  • 是通过 < > 标签来描述信息
  • 是 W3C 的推荐标准


    
        JUnit5测试框架
        Hogwarts
    

    
        接口自动化测试
        Hogwarts
    

xml请求

构建 XML 请求体

  • 外部 XML 文件
  • 字符串
  • 示例接口地址:http://dneonline.com/calculator.asmx
  • 外部 XML 文件

    
        
            1
            1
        
    

  • xml请求
import static io.restassured.RestAssured.*;
import org.junit.jupiter.api.Test;

import org.apache.commons.io.IOUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;


public class TestXML {
    @Test
    void testSoapApi() throws IOException {

        // 定义请求体数据:源自文件对象
        File file = new File("src/test/resources/add.xml");
        FileInputStream fis = new FileInputStream(file);
        String reqBody = IOUtils.toString(fis, "UTF-8");

        given()
                .contentType("text/xml")  // 定制请求内容媒体类型
                .body(reqBody)  // 定制请求体数据
                .log().headers()  // 打印请求头信息
                .log().body()  // 打印请求体信息
        .when()
                .post("http://dneonline.com//calculator.asmx")  // 发送请求
        .then()
                .statusCode(200);  // 响应状态码断言
    }
}
  • 附录一:Jackson 依赖配置

  com.fasterxml.jackson.core
  jackson-databind
  2.13.0
  test

  • IOUtils 依赖配置

  commons-io
  commons-io
  2.11.0
  test

五、json/xml响应断言

1、XML 响应断言

  • XPath简介

  • 是 XML 路径语言

  • 是 XML Path Language 的缩写

  • 是用来确定 XML 文档中某部分位置

  • XPath 语法

Xpath描述
/根节点
.现行节点
//不管位置,选择所有符合条件的元素
*匹配所有元素节点
[ ]迭代器标示
|支持迭代器中做多选

    
        
            1
            2
        
    

// 读取解析xml文件并做断言
   @Test
    void readXml() {
        File file = new File("C:\Users\86189\IdeaProjects\java\src\main\resources\2.xml");
        FileInputStream is = null;
        try {
            is = new FileInputStream(file);
            String result = IOUtils.toString(is, "UTF-8");
            given().contentType("text/xml").body(result)
                    .when()
                    .post("http://dneonline.com/calculator.asmx")
                    .then()
                    .body("//AddResult.text()",equalTo("3")).log().all();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

2、json响应断言

json简介

  • 是 JavaScript Object Notation 的缩写

  • 是一种轻量级的数据交换格式

  • 是理想的接口数据交换语言

  • 官网:https://www.json.org/json-en.html

json响应数据

{
  "args": {},
  "headers": {
    "Accept": "*
    @Test
    void testUploadFile(){

        // 需要上传的文件对象
        File myFile = new File("src/test/resources/hogwarts.txt");

        // 定义一个代理的配置信息
        RestAssured.proxy = host("localhost").withPort(8888);
        // 忽略HTTPS校验
        RestAssured.useRelaxedHTTPSValidation();

        given()
            .multiPart("hogwarts", myFile)  // 传递文件对象
            .log().headers()  // 打印请求消息头
            .log().body()  // 打印请求消息体
        .when()
            .post("https://httpbin.ceshiren.com/post")  //发送POST请求
        .then()
            .statusCode(200);  // 响应断言
    }
}
  • 携带多种数据
import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
import java.io.File;
import static io.restassured.RestAssured.given;
import static io.restassured.specification.ProxySpecification.host;

public class TestMultiParts {

    @Test
    void testUploadFiles(){

        // 需要上传的文件对象
        File myFile = new File("src/test/resources/hogwarts.txt");

        // 定义一个代理的配置信息
        RestAssured.proxy = host("localhost").withPort(8888);
        // 忽略HTTPS校验
        RestAssured.useRelaxedHTTPSValidation();

        given()
            .multiPart("hogwarts", myFile)  // 传递文件对象
            .multiPart("ceshiren", "{"hogwarts": 666}",
             "application/json")  // 传递JSON数据
            .log().headers()  // 打印请求消息头
            .log().body()  // 打印请求消息体
        .when()
            .post("https://httpbin.ceshiren.com/post")  // 发送POST请求
        .then()
            .statusCode(200);  // 响应断言
    }
}

十、代理配置

1、代理简介

  • 介于客户端与服务器之间
  • 可以监听请求和响应信息
  • 充当防火墙和 Web 过滤器

2、代理前后对比


3、代理与接口测试

  • 更直观的排查请求错误
  • 获取正确的的接口请求与响应信息
  • 开启代理工具监听请求
  • 获取自动化测试的请求与响应信息
  • 对比两次请求响应的区别

    4、REST assured 使用代理
  • 开启代理工具监听请求
  • 配置代理
    局部:通过 proxy() 方法
    全局:定义 proxy 对象

5、使用代理请求 HTTP

import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static io.restassured.specification.ProxySpecification.host;

public class TestHttpProxyConf {

    @Test
    void testHTTPProxy() {

        // 定义一个代理的配置信息
        RestAssured.proxy = host("localhost").withPort(8888);

        given()
                .proxy(8888)  // 设置代理
        .when()
                .get("http://httpbin.org/get")  // 发送 HTTP请求
        .then()
                .log().all()  // 打印完整响应信息
                .statusCode(200);  // 响应断言
    }
}

- 使用代理请求 HTTPS

import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;

import static io.restassured.RestAssured.given;
import static io.restassured.specification.ProxySpecification.host;


public class TestHttpsProxyConf {

    @Test
    void testHTTPProxy() {

        // 定义一个代理的配置信息
        RestAssured.proxy = host("localhost").withPort(8888);

        given()
                .relaxedHTTPSValidation()  // 忽略HTTPS校验
        .when()
                .get("https://httpbin.ceshiren.com/get")
        .then()
                .log().all()  // 打印完整响应信息
                .statusCode(200);  // 响应断言
    }
}

十、认证体系

1、认证体系简介

  • 是验证通信发送者的数字身份的过程
  • REST-assured 认证方案
    OAuth
    digest
    certificate 证书认证
    form 表单认证
    basic authentication 基本认证


- 使用基本认证

import io.restassured.RestAssured;
import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;
import static io.restassured.specification.ProxySpecification.host;

public class TestAuth {

    @Test
    void testAuth(){

        // 定义一个代理的配置信息
        RestAssured.proxy = host("localhost").withPort(8888);

        // 忽略HTTPS校验
        RestAssured.useRelaxedHTTPSValidation();

        // 被测接口地址
        String testURL = "https://httpbin.ceshiren.com/basic-auth/hogwarts/666";

        given()
                .auth().basic("hogwarts", "666")  // 设置基本认证
        .when()
                .get(testURL)  // 发送GET请求
        .then()
                .statusCode(200);  // 响应断言
    }
}

十一,接口加密与解密

1、加密解密简介

  • 加密:明文转换成密文的过程
  • 解密:密文还原成明文的过程
  • 常见加密算法
    AES
    RSA
    MD5
    Base64

2、解密方案

  • 通用加密算法:使用对应解密算法
  • 自研加密算法:研发提供加解密 lib
  • 第三方加密服务:寻求加密方提供远程解析服务

3、接口解密实战

import org.apache.commons.codec.binary.Base64;
import org.junit.jupiter.api.Test;

import java.nio.charset.StandardCharsets;


public class TestBase64 {
    @Test
    void testEncodeAndDecode(){

        // 加密一串数据:hogwarts
        // 获取字节数组
        byte[] arr1 = "hogwarts".getBytes(StandardCharsets.UTF_8);
        // 执行加密
        String encodedMsg = Base64.encodeBase64String(arr1);


        // 解密一串数据:aG9nd2FydHM=
        // 执行解密
        byte[] arr2 = Base64.decodeBase64("aG9nd2FydHM=");
        // 生成字符串
        String decodeMsg = new String(arr2, StandardCharsets.UTF_8);


    }
}

- 解密后响应断言

import org.apache.commons.codec.binary.Base64;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import java.nio.charset.StandardCharsets;
import java.util.LinkedHashMap;
import static io.restassured.RestAssured.given;

public class TestDecode {
    @Test
    void testDecode(){

        // 加密一串数据
        byte[] data = "hogwarts".getBytes(StandardCharsets.UTF_8);
        String secretMsg = Base64.encodeBase64String(data);

        // 发起请求,并获取响应信息
        LinkedHashMap responseForm =
            given()
                .formParam("msg", secretMsg)  // 提交表单数据
            .when()
                .post("https://httpbin.ceshiren.com/post")  // 发起POST请求
            .then()
                .log().all()  // 打印完整响应信息
                .extract().path("form");  // 提取form信息

        // 提取加密字段
        String encodedMsg = responseForm.get("msg");

        // 解密操作
        String decodedMsg = new String(Base64.decodeBase64(encodedMsg));
        // 响应断言
        Assertions.assertEquals("hogwarts", decodedMsg);
    }
}

十二、多套环境测试

1、多套环境测试背景

  • 集成测试环境
  • 验收测试环境
  • 灰度测试环境

2、多套环境测试解决方案

  • 测试环境 1
    域名:http://httpbin.org
    接口:/get
  • 测试环境 2
    域名:https://httpbin.ceshiren.com
    接口:/get

3、解决方案:

import org.junit.jupiter.api.Test;
import static io.restassured.RestAssured.given;

public class TestEnv {
    @Test
    void testOrg(){
        // 测试org环境接口
        given()
        .when()
            .get("http://httpbin.org/get")  // 发送GET请求
        .then()
            .statusCode(200);
    }

    @Test
    void testCeshiren(){
        // 测试ceshiren环境接口
        given()
        .when()
            .get("https://httpbin.ceshiren.com/get")  // 发送GET请求
        .then()
            .statusCode(200);
    }
}
import io.restassured.RestAssured;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.util.HashMap;
import static io.restassured.RestAssured.given;

public class TestEnvConf {

    @BeforeAll
    static void setupClass(){
        // 实例化环境配置对象
        HashMap envs = new HashMap<>();
        // 测试环境1的域名配置
        envs.put("org", "http://httpbin.org/get");
        // 测试环境1的域名配置
        envs.put("ceshiren", "http://httpbin.ceshiren.com/get");

        // 选定默认环境名称,方便灵活切换
        envs.put("default", "org");

        // 设置基路径,值为选定的域名地址
        RestAssured.baseURI = envs.get(envs.get("default"));
    }

    @Test
    void testEnvs(){
        given()
        .when()
            .get("/get")  // 发送GET请求
        .then();
    }

}
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import io.restassured.RestAssured;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import static io.restassured.RestAssured.given;

public class TestEnvYaml {

    @BeforeAll
    static void setupClass() throws IOException {
        

        // 实例化一个ObjectMapper 对象
        ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory());
        // 读取 resources 目录中的envs.yaml文件
        ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
        File yamlFile = new File(classLoader.getResource("envs.yaml").getFile());
        // 定义序列化的结构 TypeReference
        TypeReference> typeRef = new
                  TypeReference>() {};
        // 解析envs.yaml文件内容
        HashMap envs = objectMapper.readValue(yamlFile, typeRef);
        // 设置基路径,值为选定的域名地址
        RestAssured.baseURI = envs.get(envs.get("default"));
    }

    @Test
    void testEnvs() {

        //发起请求
        given()
        .when()
                .get("/get")
        .then()
                .statusCode(200);
    }
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/943421.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号