SpringBoot测试之高级配置方式
作者:.29.
这篇文章主要介绍了SpringBoot测试之高级配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
一、SpringBoot加载测试专用属性
加载测试范围的临时属性,应用于小范围测试环境
1.@SpringBootTest注解的properties参数
在启动测试环境时,可以通过properties参数设置测试环境专用的属性
/** * @author .29. * @create 2023-04-01 20:28 */ //properties属性,可以为当前测试用添加临时的属性配置 @SpringBootTest(properties = "test.prop=testValueByProperties") public class PropertiesAndArgsTest { @Value("${test.prop}") private String msg; @Test public void testProperties(){ System.out.println(msg); } }
对应的application.yml配置文件内容:
test: prop:
优势:比多环境开发中的测试环境影响范围小,仅在当前测试类有效。
2.@SpringBootTest注解的args参数
在启动测试环境时,可以通过args参数设置测试环境专用的传入属性
/** * @author .29. * @create 2023-04-01 20:28 */ //args属性,可以为当前测试用例添加临时的命令行参数 @SpringBootTest(args = {"--test.prop=testValueByArgs"}) public class PropertiesAndArgsTest { @Value("${test.prop}") private String msg; @Test public void testProperties(){ System.out.println(msg); } }
对应的application.yml配置文件内容:
test: prop:
二、SpringBoot加载测试专用配置
加载测试范围配置,应用于小范围测试环境
专用的配置:
/** * @author .29. * @create 2023-04-01 21:27 */ //专用的配置 @Configuration public class MsgConfig { @Bean public String msg(){ return "test @Import get msg"; } }
使用@Import注解,可以加载当前测试类专用的配置:
/** * @author .29. * @create 2023-04-01 21:30 */ @SpringBootTest @Import(MsgConfig.class) public class ConfigurationTest { @Autowired private String msg; @Test public void testConfiguration(){ System.out.println(msg); } }
成功加载到专用配置中的内容:
三、SpringBoot 模拟测试Web环境
Web环境模拟测试
- 设置测试端口
- 模拟测试启动
- 模拟测试匹配(各组成部分消息均可匹配)
1.启动Web环境的不同方式
@SpringBootTest注解的webEnvironment属性
提供了启动Web环境的选择:
默认 webEnvironment = SpringBootTest.WebEnvironment.NONE
:不启动Web服务器
webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT
:使用默认端口在测试类启动Web服务器
/** * @author .29. * @create 2023-04-01 21:39 */ //webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT:默认端口在测试类启动Web服务器 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT) public class WebTest { @Test public void test(){ } }
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT
:使用随机端口在测试类启动Web服务器
/** * @author .29. * @create 2023-04-01 21:39 */ //webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT: 随机端口 在测试类启动Web服务器 @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) public class WebTest { @Test public void test(){ } }
2.发起虚拟请求
控制层组件:
/** * @author .29. * @create 2023-04-01 22:38 */ @RestController @RequestMapping("/books") public class BookController { @GetMapping public String get(){ System.out.println("get() is running ..."); return "Springboot"; } }
发起MVC虚拟调用,模拟发起请求
/** * @author .29. * @create 2023-04-01 21:39 */ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) //@AutoConfigureMockMvc注解:开启MVC虚拟调用 @AutoConfigureMockMvc public class WebTest { @Test //@Autowired注解,注入虚拟MVC调用对象 public void testWeb(@Autowired MockMvc mockMvc) throws Exception { //创建虚拟请求,当前访问/books MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books"); //执行对应的请求 mockMvc.perform(builder); } }
成功发起虚拟请求
3.匹配响应的执行状态
虚拟请求状态匹配:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) //开启MVC虚拟调用 @AutoConfigureMockMvc public class WebTest { @Test public void testStatus(@Autowired MockMvc mockMvc) throws Exception { //创建虚拟请求,当前访问/books (这里故意写错,模拟匹配失败) MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books1"); //执行对应的请求 ResultActions actions = mockMvc.perform(builder); //设定预期值 与真实值进行比较,成功测试通过,失败测试失败 //定义本次调用的预期值 StatusResultMatchers status = MockMvcResultMatchers.status(); //预计本次调用是成功的:状态200 ResultMatcher ok = status.isOk(); //添加预期值到本次调用过程中,与真实执行结果进行匹配 actions.andExpect(ok); } }
匹配失败时,输出匹配错误原因:
4.匹配响应体
/** * @author .29. * @create 2023-04-01 21:39 */ @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) //开启MVC虚拟调用 @AutoConfigureMockMvc public class WebTest { @Test public void testBody(@Autowired MockMvc mockMvc) throws Exception { MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books"); ResultActions actions = mockMvc.perform(builder); //设定预期值 与真实值进行比较,成功测试通过,失败测试失败 //定义本次调用的预期值 ContentResultMatchers content = MockMvcResultMatchers.content(); //预计请求体为控制层组件的返回值"Springboot 测试类启动web环境 发送虚拟请求" //如果请求体反馈JSON数据,string()改为json() ResultMatcher body = content.string("Springboot"); //添加预期值到本次调用过程中,与真实执行结果进行匹配 actions.andExpect(body); } }
5.匹配响应头
@Test public void testHeader(@Autowired MockMvc mockMvc) throws Exception { MockHttpServletRequestBuilder builder = MockMvcRequestBuilders.get("/books"); ResultActions actions = mockMvc.perform(builder); //设定预期值 与真实值进行比较,成功测试通过,失败测试失败 //定义本次调用的预期值 HeaderResultMatchers header = MockMvcResultMatchers.header(); //预计请求头的Content-Type 为 text/plain;charset=UTF-8 ResultMatcher string = header.string("Content-Type", "text/plain;charset=UTF-8"); //添加预期值到本次调用过程中,与真实执行结果进行匹配 actions.andExpect(string); } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。