乐趣区

关于java:Spring-Boot-单元测试保姆级教程

起源:eamonyin.blog.csdn.net

一、单元测试的概念

概念:

  1. 单元测试(unit testing),是指对软件中的最小可测试单元进行检查和验证。在 Java 中单元测试的最小单元是类。
  2. 单元测试是开发者编写的一小段代码,用于测验被测代码的一个很小的、很明确的性能是否正确。执行单元测试,就是为了证实这 段代码的行为和咱们冀望是否统一。

单元测试援用:

家喻户晓,通过 spring initialize 创立的 Spring Boot 我的项目会在 Maven 中主动携带很多 starter 依赖:

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

Spring Boot 根底就不介绍了,举荐看这个收费教程:

https://github.com/javastacks/spring-boot-best-practice

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

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

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

spring-boot-starter-testUML 图:

二、单元测试的作用

在没有接触单元测试之前咱们是怎么做测试的?个别有两个办法:

在工夫容许的状况下,编写单元测试是程序员对代码的自测,这是对本人代码的负责。

写单元测试的两个动机:

  1. 保障或验证实现性能。
  2. 爱护曾经实现的性能不被毁坏。

三、Spring Boot 引入的 MockMvc 的概念

什么是 Mock?

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

为什么应用 Mock 对象?

应用模仿对象,能够模仿简单的、实在的对象行为。如果在单元测试中无奈应用实在对象,可采纳模仿对象进行代替。

MockMvc 的概念

MockMvc 是由 spring-test 包提供,实现了对 Http 申请的模仿,可能间接应用网络的模式,转换到 Controller 的调用,使得测试速度快、不依赖网络环境。同时提供了一套验证的工具,后果的验证非常不便。

接口 MockMvcBuilder,提供一个惟一的 build 办法,用来结构 MockMvc。次要有两个实现:StandaloneMockMvcBuilder 和 DefaultMockMvcBuilder。

MockMVC 的根本步骤

(1) mockMvc.perform 执行一个申请。

(2) MockMvcRequestBuilders.get(“XXX”)结构一个申请。

(3) ResultActions.param 增加申请传值

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

(5) ResultActions.andExpect 增加执行实现后的断言。

(6) ResultActions.andDo 增加一个后果处理器,示意要对后果做点什么事件,比方处应用 print()输入整个响应后果信息。

(7) 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 {
@Resource
private XXXService XXXService;
@Test
public 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 环境的上下文的反对。

举荐一个开源收费的 Spring Boot 最全教程:

https://github.com/javastacks/spring-boot-best-practice

五、Controller 层的单元测试

创立测试类步骤见第四局部,此处略。

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

MockMvc 实现了对 Http 申请的模仿,可能间接应用网络的模式,转换到 Controller 的调用,这样能够使得测试速度快、不依赖网络环境,而且提供了一套验证的工具,这样能够使得申请的验证对立而且很不便。

Controller 层局部的代码将分为三个代码块解说,外面有看不懂的代码先不要焦急哦😄,会在第五局部结尾处给大家汇总解答的,大家要保持看到最初哟!😁

代码块一:

@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class DfTaskRecordControllerTest {
@Autowired
private MockMvc mockMvc;
@Before
public 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 单元测试的区别

  1. Spring Boot 的单元测试次要针对办法层面,能够测试 Service 层这类非对外裸露的接口的类中办法,并且可一次性批量测试多个办法、反对事务回滚。
  2. 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 是介样婶儿滴~~😊

近期热文举荐:

1.1,000+ 道 Java 面试题及答案整顿(2022 最新版)

2. 劲爆!Java 协程要来了。。。

3.Spring Boot 2.x 教程,太全了!

4. 别再写满屏的爆爆爆炸类了,试试装璜器模式,这才是优雅的形式!!

5.《Java 开发手册(嵩山版)》最新公布,速速下载!

感觉不错,别忘了顺手点赞 + 转发哦!

退出移动版