作者:进阶的小名

eamonyin.blog.csdn.net/article/details/112434830

文章目录

  • 一、 单元测试的概念

  • 二、单元测试的作用

  • 三、Spring Boot引入的MockMvc的概念

  • 四、Service层的单元测试

  • 五、Controller层的单元测试

  • 六、断言的概念

  • 七、新断言assertThat使用

  • 八、Postman与Spring Boot 单元测试的区别

  • 九、Postman基本用法

一、 单元测试的概念

概念:

1.单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在Java中单元测试的最小单元是类。

2.单元测试是开发者编写的一小段代码,用于检验被测代码的一个很小的、很明确的功能是否正确。执行单元测试,就是为了证明这 段代码的行为和我们期望是否一致。

单元测试引用:

1.众所周知,通过spring initialize创建的Spring Boot项目会在Maven中自动携带很多starter依赖:

其中包含了一个名为spring-boot-starter-test的依赖,本文是围绕这个依赖展开。

2.Spring Boot中引入单元测试很简单,添加如下依赖(即spring-boot-starter-test依赖):

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope>
</dependency>

3.spring-boot-starter-test有如下几个库:

spring-boot-starter-testUML图:

序号 库名的解释
1 JUnit 5:包含兼容 JUnit 4,Java 应用程序单元测试的事实标准
2 Spring Test 和 SpringBootTest:对Spring Boot应用程序的公共和集成测试支持
3 AssertJ:流式断言库
4 Hamcrest:匹配对象库
5 Mockito:Java 模拟框架
6 JSONassert:JSON 断言库
7 JsonPath:JSON XPath

二、单元测试的作用

在没有接触单元测试之前我们是怎么做测试的?一般有两个方法:

方法 弊端
方法一:启动整个应用,像用户正常操作一样。点击界面按钮,调用一个 API 等。 每次测试都要启动整个项目
方法二:在代码某个地方写一个临时入口,例如 java 的 main 方法,测试某个方法或者某个类。 入口用完要删除,不然会影响项目的运行速度或效率

在时间允许的情况下,编写单元测试是程序员对代码的自测,这是对自己代码的负责。

写单元测试的两个动机:

  1. 保证或验证实现功能。

  2. 保护已经实现的功能不被破坏。

三、Spring Boot引入的MockMvc的概念

1.  什么是Mock?

在面向对象的程序设计中,模拟对象(英语:mock object)是以可控的方式模拟真实对象行为的假对象。在编程过程中,通常通过模拟一些输入数据,来验证程序是否达到预期结果。

2.  为什么使用Mock对象?

使用模拟对象,可以模拟复杂的、真实的对象行为。如果在单元测试中无法使用真实对象,可采用模拟对象进行替代。

3.  MockMvc的概念

MockMvc是由spring-test包提供,实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,使得测试速度快、不依赖网络环境。同时提供了一套验证的工具,结果的验证十分方便。

接口MockMvcBuilder,提供一个唯一的build方法,用来构造MockMvc。主要有两个实现:StandaloneMockMvcBuilder和DefaultMockMvcBuilder。

实例化方法 实例&解释
方法一 mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();通过参数指定一组控制器,这样就不需要从上下文获取了
方法二 mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();指定WebApplicationContext,将会从该上下文获取相应的控制器并得到相应的MockMvc

4.  MockMVC的基本步骤

  • mockMvc.perform执行一个请求。

  • MockMvcRequestBuilders.get(“XXX”)构造一个请求。

  • ResultActions.param添加请求传值

  • ResultActions.accept()设置返回类型

  • ResultActions.andExpect添加执行完成后的断言。

  • ResultActions.andDo添加一个结果处理器,表示要对结果做点什么事情,比如处使用print()输出整个响应结果信息。

  • ResultActions.andReturn表示执行完成后返回相应的结果。

四、Service层的单元测试

(以下图片均引自文末学习文章,因为公司项目不方便截图)

第一步:Spring Boot中单元测试类写在src/test/java目录下,你可以手动创建具体测试类,也可以通过IDEA自动创建测试类,如下图:(注:点选并打开相应代码界面,再点击菜单栏的Navigate)

第二步:按照第一步的方法,点击测试后,出现图一的对话框(如果想要测试的类已经存在测试类了会被列出来,也可以重新创建一个新的测试类),点击”Create New Test…”会弹出图二的对话框,可以选择是否生成setUp以及要测试的成员方法等:

图一

图二

第三步:至此Service层的测试类就创建好了,测试类自动生成到了src/test/java目录下项目的同级目录中,如下图:

Service层测试代码如下:

@SpringBootTest
@RunWith(SpringRunner.class)
public class XXXServiceTest {@Resourceprivate XXXService XXXService;@Testpublic void conflictTime() {DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDate start = LocalDate.parse("2020-10-26", dtf);LocalDate end = LocalDate.parse("2020-10-31", dtf);Integer integer = XXXService.ConflictTime("10000001", start, end);Assert.assertThat(integer, Matchers.notNullValue());//assertThat断言后面介绍    }
}

注解解释:

@SpringBootTest:获取启动类,加载配置,寻找主配置启动类(被 @SpringBootApplication 注解的) @RunWith(SpringRunner.class):让JUnit运行Spring的测试环境,获得Spring环境的上下文的支持

五、Controller层的单元测试

创建测试类步骤见第四部分,此处略。

  • 第四部分只是针对Service层做了测试,但是咱么也需要对Controller层(API)做测试,这时候就用到MockMvc了,它使得你无需启动项目工程就能测试这些接口。

  • MockMvc实现了对Http请求的模拟,能够直接使用网络的形式,转换到Controller的调用,这样可以使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样可以使得请求的验证统一而且很方便。

Controller层部分的代码小名将分为三个代码块讲解,里面有看不懂的代码先不要着急哦????,小名会在第五部分结尾处给大家汇总解答的,大家要坚持看到最后哟!????

代码块一:

@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class DfTaskRecordControllerTest {@Autowiredprivate MockMvc mockMvc;@Beforepublic void setUp() throws Exception {System.out.println("---------------start---------------");save();get();System.out.println("================end================");}

注解解释:

@SpringBootTest>:获取启动类,加载配置,寻找主配置启动类(被 @SpringBootApplication 注解的)

@RunWith(SpringRunner.class)>:让JUnit运行Spring的测试环境,获得Spring环境的上下文的支持 @AutoConfigureMockMvc:用于自动配置MockMvc,配置后MockMvc类可以直接注入,相当于new MockMvc @Before:初始化方法 ,对于每一个测试方法都要执行一次

代码块二:

@Test
@Transactional
@Rollback()
public void save() throws Exception {String json"{……}";//执行一个RequestBuilder请求,会自动执行SpringMVC的流程并映射到相应的控制器执行处理;mockMvc.perform(MockMvcRequestBuilders.post("/XXX/save").content(json.getBytes()) //传json参数.accept(MediaType.APPLICATION_JSON).contentType(MediaType.APPLICATION_JSON_VALUE).header("Authorization","Bearer ********-****-****-****-************")).andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());
}

注解解释:

@Transactional:开启事务功能

@Rollback(): 事务回滚,默认是true

代码块三:

@Test
public void get() throws Exception{ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders.get("/XXX/get").param("id", "**********").header("Authorization", "Bearer ********-****-****-****-************"));resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");resultActions.andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());}

/get运行结果如下:

现在小名将上面的一些琐碎的知识点汇总一下:

  1. mockMvc.perform:执行一个请求

  2. MockMvcRequestBuilders.get(“/XXX/get”):构造一个请求,Post请求使用.post方法

  3. contentType(MediaType.APPLICATION_JSON_VALUE):代表发送端发送的数据格式是application/json;charset=UTF-8

  4. accept(MediaType.APPLICATION_JSON):代表客户端希望接受的数据类型为application/json;charset=UTF-8

  5. header(“Authorization”,“Bearer XXXX”):代表在报文头添加一些必须的信息,这里添加的是token

  6. ResultActions.andExpect:添加执行完成后的断言

  7. ResultActions.andExpect(MockMvcResultMatchers.status().isOk()):方法看请求的状态响应码是否为200如果不是则抛异常,测试不通过

  8. ResultActions.andDo:添加一个结果处理器,表示要对结果做点什么事情,比如此处使用print():输出整个响应结果信息

六、断言的概念

  1. 断言(assert),是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。

  2. 使用断言是判断一个函数或对象的一个方法所产生的结果是否符合你期望的那个结果。

七、新断言assertThat使用

JUnit 4.4 结合 Hamcrest 提供了一个全新的断言语法——assertThat。程序员可以只使用 assertThat 一个断言语句,结合 Hamcrest 提供的匹配符,就可以表达全部的测试思想。

assertThat 的优点:

优点 1:以前 JUnit 提供了很多的 assertion 语句,如:assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等,现在有了 JUnit 4.4,一条 assertThat 即可以替代所有的 assertion 语句,这样可以在所有的单元测试中只使用一个断言方法,使得编写测试用例变得简单,代码风格变得统一,测试代码也更容易维护。

优点 2:assertThat 使用了 Hamcrest 的 Matcher 匹配符,用户可以使用匹配符规定的匹配准则精确的指定一些想设定满足的条件,具有很强的易读性,而且使用起来更加灵活。

优点 3:assertThat 不再像 assertEquals 那样,使用比较难懂的“谓宾主”语法模式(如:assertEquals(3, x);),相反,assertThat 使用了类似于“主谓宾”的易读语法模式(如:assertThat(x,is(3));),使得代码更加直观、易读。

assertThat 的基本语法如下:

assertThat( [value], [matcher statement] );

value :接下来想要测试的变量值;matcher statement :使用 Hamcrest 匹配符来表达的对前面变量所期望的值的声明,如果 value 值与 matcher statement 所表达的期望值相符,则测试成功,否则测试失败。

八、Postman与Spring Boot 单元测试的区别

  • Spring Boot的单元测试主要针对方法层面,可以测试Service层这类非对外暴露的接口的类中方法,并且可一次性批量测试多个方法、支持事务回滚。

  • Postman针对接口进行http测试,我平时这个比较多,创建的测试接口可保存、分类。

九、Postman基本用法

Postman是一款功能强大的网页调试与发送网页HTTP请求的工具。Postman能够发送任何类型的HTTP请求(GET, HEAD, POST,PUT..),附带任何数量的参数和HTTP headers。支持不同的认证机制(basic, digest,OAuth),接收到的响应语法高亮(HTML,JSON或XML)。

安装Postman官方网站:https://www.getpostman.com/apps

安装后,Postman是介样婶儿滴~~????

详细的使用方法,小名在这里帮大家找到了一篇保姆级Postman使用教程,

https://www.cnblogs.com/okong/p/springboot-fifteen.html

推荐好文

强大,10k+点赞的 SpringBoot 后台管理系统竟然出了详细教程!分享一套基于SpringBoot和Vue的企业级中后台开源项目,代码很规范!
能挣钱的,开源 SpringBoot 商城系统,功能超全,超漂亮!

SpringBoot单元测试保姆级教程,文末介绍Postman的基本使用相关推荐

  1. XXL-JOB详解(整合springboot)保姆级教程

    文章目录 XXL-JOB简介 XXL-JOB是什么 为什么需要任务调度平台,而不用传统的 Timer 与 Quartz 为什么选择XXL-JOB,不选择elasticjob ==学习之前必看,少走很多 ...

  2. win系统的阿里云服务器部署IDEASpringBoot项目保姆级教程

    win系统的阿里云服务器部署SpringBoot项目保姆级教程 前言 配置阿里云服务器 配置环境 环境配置中的坑 还有别的坑的话,私信我我补充......毕竟配置是最基本的,还想咋样... jar包导 ...

  3. Zotero+坚果云打造多设备同步的文献管理工具(保姆级教程)

    Zotero+坚果云打造多设备同步的文献管理工具(保姆级教程) 文章目录 Zotero+坚果云打造多设备同步的文献管理工具(保姆级教程) Zotero介绍 所需软件或插件 实现方式 步骤1:坚果云配置 ...

  4. SpringBoot 配置 generator代码生成+knife4j接口文档(2种模板设置、逻辑删除、字段填充 含代码粘贴可用)保姆级教程(注意事项+建表SQL+代码生成类封装+测试类)

    保姆级教程,逻辑删除及字段自动填充设置,特别要说明的是本次用的是MySQL数据库,如果使用Oracle数据库是,数据库配置需要改变,数据库表一定要大写,否则无法生成代码. 数据库表 CREATE TA ...

  5. 快速上手Springboot项目(登录注册保姆级教程)

    本文章对SpringBoot开发后端项目结构做了简单介绍,并示范了使用SpringBoot+MySQL实现登录的后端功能,与本博客的另一篇文章 Vue 实现登录注册功能(前后端分离完整案例) | Ma ...

  6. FastText词向量训练、使用及可视化操作【保姆级教程(包含藏文处理方法)】

    目录 一.前言 二.FastText词向量训练 2.1 数据输入格式 2.2词向量训练 三.词向量使用 一.前言 本文是word2vec词向量篇的姊妹篇.fasttext是静态词向量构建方法的一种,本 ...

  7. Word2Vec词向量训练、使用及可视化操作【保姆级教程(包含藏文处理方法)】

    目录 一.前言 二.Word2Vec词向量训练 2.1 数据输入格式 2.2词向量训练 三.词向量使用 四.词向量可视化 一.前言 word2vec是静态词向量构建方法的一种,本文将介绍word2ve ...

  8. 保姆级教程——将springboot项目部署到阿里云服务器(小白包会)

    保姆级教程--将springboot项目部署到阿里云服务器(小白包会) 前言: 昨天本想着看论文,结果发现找的论文和课题不一致.那干点什么好呢?那就把我的毕业设计(一个springboot项目)部署到 ...

  9. STM32智能定位系统保姆级教程(一)硬件介绍

    STM32智能定位系统保姆级教程(一)硬件介绍 写在前面 产品概述 模块特性 各模块引脚说明 串口连接调试说明 操作说明 原理图及PCB 3D打印 逻辑关系 写在前面 好久没更新了,小更一下 这是完全 ...

  10. ESP 保姆级教程 基础篇 —— 环境安装、NodeMcu引脚介绍

    快速导读 1.安装 Arduino IDE -- 1.8.13 2.安装 ESP8266 -- 2.7.4 3.配置Arduino IDE 首选项 4.硬件开发板 -- ESP8266 NodeMcu ...

最新文章

  1. python3中,os.path模块下常用的用法总结
  2. Android-Material-Examples
  3. 希腊字母(mark)
  4. ERP系统开发平台 (C#语言,支持多数据库)
  5. java 注解入门 简书_Java基础-注解
  6. docker certbot 一键申请https证书、证书过期续订、续订成功自动重启服务
  7. 博电继保测试仪说明书_北京博电继电保护测试仪
  8. springboot整合哨兵模式连接redis
  9. HCIA-IoT V2.5物联网初级考试总结(附题库,历年真题,刷题软件)
  10. java 定时任务的实现_Java定时任务实现的几种方式
  11. CTPN - 自然场景文本检测
  12. 修改服务器linux的yum源为阿里源yum源
  13. kibana更改时间显示格式
  14. 嘉楠科技多位高管退出,知情人称管理层夺权内斗
  15. 批量提取html文字,批量提取网页内容(全自动)
  16. 2019重新起航:搭建个人博客
  17. c语言输入坐标三角形周长面积,3.1.7计算三角形周长和面积
  18. 论文:Ref-NMS: Breaking Proposal Bottlenecks in Two-Stage Referring Expression Grounding
  19. 职业情商修炼的3523法
  20. 单测利器——PowerMockito使用心得

热门文章

  1. python抢淘宝的东西-Python 实现毫秒级淘宝抢购脚本的示例代码
  2. iOS功能测试工具 Frank
  3. Spring web开发用post方法和button遇到http405的一种解决方法
  4. Java多线程(7):JUC(下)
  5. 如何下载最新Windows10镜像文件(.iso文件)
  6. Mysql日常操作记录
  7. Kali Linux上最佳安全测试工具
  8. 算法的复杂度度量--时间复杂度以及空间复杂度
  9. zoj水题分类(自己练习)
  10. C语言,输入三个数求其平均值!