SpringBoot——在测试阶段验证Web表现层的接口是否正常

验证请求状态

之前我们实现了在测试环境中开启Web环境,并且在测试阶段发送虚拟请求,并看到了返回的结果,这次我们不止要看他的请求结果,还要看他的请求过程和请求状态

匹配请求状态

首先就是查看请求的状态。主要介绍的就是一个重要的类,也是我们这一节的核心类:MockMvcResultMatchers,这个类是一个结果匹配器,他会提供不同请求状态的请求对象,然后我们可以拿到本次请求的结果对象与他的请求状态的对象做对比,查看本次请求的状态,具体的代码如下:

操作代码

package com.spring;import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.RequestBuilder;
import org.springframework.test.web.servlet.ResultActions;
import org.springframework.test.web.servlet.ResultMatcher;
import org.springframework.test.web.servlet.request.MockHttpServletRequestBuilder;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.result.StatusResultMatchers;@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
@AutoConfigureMockMvc
public class SpringBootTest02ApplicationTests {@Testpublic void test(@Autowired MockMvc mockMvc) throws Exception {MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/test");
//        获得本次请求的信息ResultActions perform = mockMvc.perform(builder);
//        获取请求状态信息StatusResultMatchers status = MockMvcResultMatchers.status();
//        获取请求成功时候的请求状态ResultMatcher ok = status.isOk();
//        添加对比,将请求成功的状态与本次请求的状态做对比,如果匹配成功则表示请求成功,如果匹配失败,则表示亲请求失败ResultActions resultActions = perform.andExpect(ok);System.out.println(resultActions);}
}

大致的流程就是首先获取本次请求的结果对象,然后获取请求成功时候的对象,两者进行对比,最终的结果就可以反映出请求的结果是否和我们的预期值相同,我们来看运行结果:
在这里插入图片描述
如果是请求成功的情况,他本身什么都不会输出,而如果是请求失败了,就会输出很多的信息,我们可以故意把他的请求地址指向一个不存在的地址让他找不到就能看到信息了:
在这里插入图片描述
这里改一下他的请求地址,改到一个不存在的地址,这次我们再次运行代码:
在这里插入图片描述
在这里插入图片描述
这里面的数据就很多了,但是大概的也分为这几个类别,最下面的就是我们这次的匹配结果,很显然,我们设置的预期值是OK,但是他的真实值是not found,很明显的匹配不上,他就告诉我们了。
在这里插入图片描述
当然这里面还有一个有意思的地方就是,如果你的预期值就是not found,那么如果你的请求真是没有找到,那么这个程序就不会报错,但是Controller不会被调用,信息也就不会显示出来。哈哈,很无用,谁会故意测试一个Bug呢。

匹配响应体

匹配响应体的过程和匹配相应状态的过程是一样的,只不过是调用的方法替换一下,之前是调用的status()方法,现在改成content()方法,流程都是一样的,设置期待值,与真实值做匹配,最终返回结果:
在这里插入图片描述

@Testpublic void textBody(@Autowired MockMvc mockMvc) throws Exception {MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/test");ResultActions perform = mockMvc.perform(requestBuilder);ContentResultMatchers content = MockMvcResultMatchers.content();ResultMatcher string = content.string("Test Controller ……");ResultActions resultActions = perform.andExpect(string);}

我们运行代码测试一下:
在这里插入图片描述
如果期待值和真实值是一样的,那么就会一切顺利,如果不一样,就会打印出很多的信息:
在这里插入图片描述
之前的信息就不用看了,都是一样的,关键在于后面的信息,预期值和实际值不一样,他会告诉我们请求体是什么,预期的请求体是什么,真实的请求体是什么。

匹配响应体(JSON)

匹配JSON数据和匹配String数据基本是一样的,只不过方法不是String()而是json(),然后预期值的内容也换成json字符串即可。
返回json,最简单的方法就是使用@ResponseBody注解的特性,返回一个对象然后自动将对象转换成json格式在屏幕上显示。
首先我们创建一个类,用于被返回:
在这里插入图片描述
这就一切从简了,有两个属性,然后用lombok提供接口方法。然后我们修改一下Controller,让他可以返回对象:
在这里插入图片描述
然后我们启动这个SpringBoot,然后访问一下这里看是不是能顺利的打印这个JSON文件:
在这里插入图片描述
好,他确实是输出了JSON字符串,剩下的就简单了,换一下方法,然后直接把这个JSON字符串赋值过去当作预期值,然后运行看一下效果:

@Testpublic void textBodyJson(@Autowired MockMvc mockMvc) throws Exception {MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/test");ResultActions perform = mockMvc.perform(requestBuilder);ContentResultMatchers content = MockMvcResultMatchers.content();ResultMatcher json = content.json("{\"id\":2,\"name\":\"JavaWeb编程\"}");ResultActions resultActions = perform.andExpect(json);}

在这里插入图片描述
直接复制之后,我们稍微更改一下,让他和真实值有点不同,好让他报错,然后我们看报错信息:
在这里插入图片描述
上面的信息就是我们的相应信息,下面的红色的字就是匹配的结果,他会告诉你是哪里的属性出现了问题,这里他就说是id属性,因为我就是修改了id属性,预期值是2,真实值是1 ,匹配不上。

匹配请求头

请求头的匹配流程和之前都是一样的,无非就是方法不一样而已,我们直接上代码:

@Testpublic void testHandler(@Autowired MockMvc mockMvc) throws Exception {MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get("/test");ResultActions perform = mockMvc.perform(requestBuilder);HeaderResultMatchers header = MockMvcResultMatchers.header();
//        匹配请求头中的键值对,定义规则,当相应的数据不是JSON格式的时候就会匹配不上ResultMatcher heade = header.string("Content-Type", "application/json");ResultActions resultActions = perform.andExpect(heade);

预期值是相应的数据类型是JSON格式,也就是说当相应的文件不是JSON格式的时候,就匹配不上就会报错,我们把之前的Controller修改一下:
在这里插入图片描述
让他的返回值类型编程String类型,这样在相应的时候就肯定不是JSON格式的了,然后我们启动测试看一下运行结果:
在这里插入图片描述
报错了,预期是是JSON类型,实际值是String类型。
可以看到在这种匹配测试的时候其实流程都是差不多的,就是切换一下使用的方法即可。

使用场景

这种匹配测试在使用的时候,一般会多个匹配规则一起使用,比如我们第一个会先匹配响应状态,然后再匹配请求体,最后是请求头,这样我们的规则会更完善,最终的匹配结果也最精准。
大致的代码如下所示

@Testpublic void TestMatching(@Autowired MockMvc mockMvc) throws Exception {MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/tests");ResultActions perform = mockMvc.perform(builder);
//        首先测试请求状态StatusResultMatchers status = MockMvcResultMatchers.status();ResultMatcher ok = status.isNotFound();perform.andExpect(ok);
//        然后匹配请求体ContentResultMatchers content = MockMvcResultMatchers.content();ResultMatcher string = content.string("TestController ……");perform.andExpect(string);
//        最后匹配响应头HeaderResultMatchers header = MockMvcResultMatchers.header();ResultMatcher heade = header.string("Content-Type", "application/json");perform.andExpect(heade);}

当然,能测试的部分肯定不止这些,之前我们看到报错信息中:
在这里插入图片描述
这里面的内容都可以进行匹配测试,有兴趣的可以自己尝试一下

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Vue脚手架

(193条消息) 第 3 章 使用 Vue 脚手架_qq_40832034的博客-CSDN博客 初始化脚手架 说明 1.Vue脚手架是Vue官方提供的标准化开发工具(开发平台) 2.最新的版本是4.x 3.文档Vue CLI脚手架(命令行接口) 具体步骤 1.如果下载缓慢…

短视频抖音seo矩阵系统源码:技术开发与实践(三)

一、 技术开发文档说明 1. 系统架构 短视频抖音seo矩阵源码部署功能架构包含:多模式视频剪辑,视频批量处理、文字转语音、视频批量发布、多平台账号管理、 智能在线客服、粉丝画像及数据统计分析、抖音seo排名优化采集等。 2. 抖音seo排名系统模块组成…

三张表学会MySQL的单表操作!

表单一信息 1、查询表中所有学生的信息 mysql> select * from student; 2、 查询表中所有学生的姓名和英语成绩 mysql> select name,english from student; 3、过滤表中的重复数据 mysql> select DISTINCT * from student; 4、统计每个学生的总分 mysql> sele…

[CVPR‘23] PanoHead: Geometry-Aware 3D Full-Head Synthesis in 360 deg

论文|项目 总结: 任务:3D human head synthesis现有问题:GANs无法在「in-the-wild」「single-view」的图片情况下,生成360度人像解决方案:1)提出了two-stage self-adaptive image alignment&am…

《Spring系列》第18章 监听器Listener

前言 陆续阅读了Spring Boot源码中,有不少地方都用到了监听器。每次看到监听器的代码都一头雾水,不懂其中的设计理念,这次决定肝一篇监听器的博文。 一、监听器 1.概述 何为监听器?就是用来监听程序执行的。监听器可以做什么事…

从单体到SpringBoot/SpringCloud微服务架构无感升级的最佳实践

目录导读 从单体到SpringBoot/SpringCloud微服务架构无感升级的最佳实践1. 业务背景2. 当前问题3. 升级方案3.1 架构设计4. 详细设计4.1 迁移阻碍4.2 解决思路 5. 实现过程5.1 认证兼容改造5.2 抽象业务流程5.2.1 抽象业务的思路5.2.2 抽象业务的抽象编码5.2.3 抽象业务的具体实…

华为VRP系统基础

系列文章目录 华为数通学习(1) 目录 一,什么是VRP? 二,VRP的发展 三,VRP的文件系统 3.1,系统文件:.cc结尾 ​编辑 3.2,配置文件:.cfg,.zip,.dat结尾 3.…

Redis 删除 key用 del 和 unlink 有啥区别?

问题 del 和 unlink 有啥区别啊?为什么String类型删除不会做异步删除? 彬彬回答 DEL 和 UNLINK 都是同步的释放 key 对象,区别是怎么释放后面的 value 对象 DEL 每次都是同步释放 value 部分,如果 value 很大,例如一…

来啦!OceanBase 第7期技术征文活动获奖名单公布!

“小鱼”的诞生与成长离不开广大开发者的陪伴与支持,我们非常兴奋能把 4.1 版本的这一系列新能力带给大家,“小鱼”会游得更快更远,也会陪伴更多数据库开发者一同成长。 OceanBase 联合墨天轮技术社区,举行「4.1 上手体验」第五届…

学习系统编程No.26【信号处理实战】

引言: 北京时间:2023/6/26/13:35,昨天12点左右睡觉,本以为能和在学校一样,7点左右起床,设置了7点到8点30时间段内的4个闹钟,可惜没想到啊,没醒,直接睡到了12点&#xff…

【复习30-35题】【每天40分钟,我们一起用50天刷完 (剑指Offer)】第二十一天 21/50

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)   文章字体风格: 红色文字表示&#…

Paddle OCR 安装使用教程

文章目录 一、简介二、使用教程三、模型调用四、效果展示 一、简介 PaddleOCR是飞浆开源文字识别模型,最新开源的超轻量PP-OCRv3模型大小仅为16.2M。同时支持中英文识别;支持倾斜、竖排等多种方向文字识别;支持GPU、CPU预测,并且…