网站首页 > 博客文章 正文
背景
相信初学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请求,对于结果校验也提供了很多的断言机制。
对于一些经常变化的业务接口写集成测试的意义不是特别大。
是否需要编写集成测试还是要看接口的重要程度、项目的时间等多方面因素来决定。
小伙子,刀给你了,什么时候用你自己决定啦
- 上一篇: IDEA 新一代神级接口调试工具,贼好用,真是相见恨晚
- 下一篇: Postman接口测试工具完整教程
猜你喜欢
- 2025-01-20 不会接口测试?用Postman轻松入门(八上)——请求结果断言方法
- 2025-01-20 接口测试经典面试题(附答案)
- 2025-01-20 不会接口测试?用Postman轻松入门(六)——Post请求xml格式
- 2025-01-20 postman系列之批量执行接口测试用例
- 2025-01-20 Postman接口测试工具完整教程
- 2025-01-20 Apifox 「极简」的调试模式来了!接口调试完,文档自动有!
- 2025-01-20 IDEA 新一代神级接口调试工具,贼好用,真是相见恨晚
- 2025-01-20 postman实战:4.mock模拟测试
- 2025-01-20 不会接口测试?用Postman轻松入门(五)Post请求Json格式
- 2025-01-20 使用C#创建服务端Web API
你 发表评论:
欢迎- 367℃用AI Agent治理微服务的复杂性问题|QCon
- 358℃初次使用IntelliJ IDEA新建Maven项目
- 357℃手把手教程「JavaWeb」优雅的SpringMvc+Mybatis整合之路
- 351℃Maven技术方案最全手册(mavena)
- 348℃安利Touch Bar 专属应用,让闲置的Touch Bar活跃起来!
- 346℃InfoQ 2024 年趋势报告:架构篇(infoq+2024+年趋势报告:架构篇分析)
- 345℃IntelliJ IDEA 2018版本和2022版本创建 Maven 项目对比
- 342℃从头搭建 IntelliJ IDEA 环境(intellij idea建包)
- 最近发表
- 标签列表
-
- powershellfor (55)
- messagesource (56)
- aspose.pdf破解版 (56)
- promise.race (63)
- 2019cad序列号和密钥激活码 (62)
- window.performance (66)
- qt删除文件夹 (72)
- mysqlcaching_sha2_password (64)
- ubuntu升级gcc (58)
- nacos启动失败 (64)
- ssh-add (70)
- jwt漏洞 (58)
- macos14下载 (58)
- yarnnode (62)
- abstractqueuedsynchronizer (64)
- source~/.bashrc没有那个文件或目录 (65)
- springboot整合activiti工作流 (70)
- jmeter插件下载 (61)
- 抓包分析 (60)
- idea创建mavenweb项目 (65)
- vue回到顶部 (57)
- qcombobox样式表 (68)
- vue数组concat (56)
- tomcatundertow (58)
- pastemac (61)
本文暂时没有评论,来添加一个吧(●'◡'●)