四、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():输出整个响应结果信息
六、断言的概念
断言(assert),是编程术语,表示为一些布尔表达式,程序员相信在程序中的某个特定点该表达式值为真。可以在任何时候启用和禁用断言验证,因此可以在测试时启用断言而在部署时禁用断言。
使用断言是判断一个函数或对象的一个方法所产生的结果是否符合你期望那个结果。
七、新断言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是介样婶儿滴~~😊