发布日期:2024-12-13 07:36 点击次数:55
布景
顺服入门spring boot的同学在各大培训视频能够教程中齐会教你若何编写接口。
比如咱们要写一个接口很浅易
java
代码解读
复制代码
@RestController @RequestMapping("") @Slf4j public class XiaoZouController { @GetMapping("/xiaozou") public String testByXiaoZouJiShu(TestDTO testDTO) { return testDTO; } }
加几个注解,一个接口就完成了。
如若要测试咱们一般等于通过postman能够apifox来测试。
使用这两种时势测试有个污点等于测试用例很难复用,其次无法在ci/cd中进行自动化测试。
部分api搞定器具撑握保存测试用例,然则永久是和代码永诀的,不利于重视
是以为了接口的测试,咱们需要编写集成测试。
缺憾的是许多建立很少了解在spring boot中若何编写集成测试,接下来咱们就来详备运筹帷幄下spring boot中的集成测试
集成测试
在spring boot中集成测试的时势有许多,咱们接下来逐一运筹帷幄,望望哪种时势最符合、最优雅
手动注入controller进行测试
spring boot提供了@SpringBootTest注解来进行集成测试。
一般东谈主测试controller齐会这么测试
java
代码解读
复制代码
@SpringBootTest @Profile("dev") class XiaoZouController { @Autowired private XiaoZouController xiaoZouController; @Test public void testController() { TestDTO testDTO = new TestDTO(); String xiaoZouJiShu = xiaoZouController.testByXiaoZouJiShu(testDTO); assertEquals("xiaoZouJiShu", xiaoZouJiShu); } }
使用这种时势进行测试有几个污点
无法模拟http肯求仅能测试controller的代码逻辑,骨子测试也等于server的逻辑像一些http中比如header、cookie等信息无法模拟,比如咱们有一些切面进行了肯求头的处理,比如咱们从header中取得了uid等信息,这种情况下咱们就无法进行测试
基于TestRestTemplate进行测试
如若咱们念念要模拟http肯求,咱们不错使用TestRestTemplate来进行测试
java
代码解读
复制代码
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @Profile("dev") public class XiaoZouController { @LocalServerPort private int port; @Autowired private TestRestTemplate restTemplate; @Test void greetingShouldReturnDefaultMessage() throws Exception { assertThat(this.restTemplate.getForObject("http://localhost:" + port + "/xiaozou", String.class)).contains("xiaozou"); } }
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)示意当场端口运转@LocalServerPort示意取适合场端口使用TestRestTemplate是来模拟http肯求的调用
这种时势测试也有污点
运转了一个土产货处事器,运转慢关于恶果校验莫得提供开箱即用的断言机制
基于MockMvc进行测试
如若咱们念念要土产货不运转处事器,仅仅测试处事器底下的档次,咱们不错使用MockMvc来进行测试
这与处理实在的http肯求处理时势不异,然则莫得处事器运转本钱
测试代码如下
java
代码解读
复制代码
@SpringBootTest @AutoConfigureMockMvc @Profile("dev") public class XiaoZouControllerTest { @Autowired private MockMvc mockMvc; @Test void greetingShouldReturnDefaultMessage() throws Exception { Long uid = 12345L; mockMvc.perform(MockMvcRequestBuilders.get("/xiaozou") .header("uid", uid) .contentType(MediaType.APPLICATION_JSON)) .andExpect(status().isOk()) .andExpect(jsonPath("$.code").value(200)) .andExpect(jsonPath("$.data.uid").value(uid)) .andExpect(jsonPath("$.data.version").doesNotExist()) .andExpect(jsonPath("$.data.deviceId").value(IsNull.nullValue())); } }
添加@AutoConfigureMockMvc注解自动注入MockMvc通过@Autowired注入MockMvc对象通过mockMvc进行http肯求模拟通过.hearder模拟header信息通过.contentType模拟content-type信息通过.andExpect进违警果校验通过jsonPath进行json恶果校验
转头
spring boot中测试controller有多种时势。
然则我合计最佳的时势依然通过@AutoConfigureMockMvc进行测试
无须运转处事器,测试速率快,况兼不错模拟http肯求,关于恶果校验也提供了许多的断言机制。
关于一些经常变化的业务接口写集成测试的兴致不是相配大。
是否需要编写集成测试依然要看接口的重猛进度、项策画时辰等多方面身分来决定。
小伙子,刀给你了,什么时刻用你我方决定啦