做 Spring Boot 开发的新手朋友,是不是经常遇到这种情况?辛辛苦苦写完一个接口,自己用 Postman 手动测了两次觉得没问题,上线后却被反馈 “参数传错会报错”“返回格式不对”?手动测试不仅麻烦,还容易漏掉各种边界情况。其实啊,用 JUnit 配合 Spring Boot 的测试工具,就能自动测试接口,省事儿又靠谱。今天兔子哥就带零基础的你入门接口测试,跟着步骤做,你也能写出靠谱的接口测试用例!
一、先明白:接口测试到底测啥?为啥非要用 JUnit?
可能有朋友会问,接口测试不就是发个请求看返回吗?用 Postman 点一点不就行了?话是这么说,但手动测试有两个大问题:一是重复劳动,改一次接口就得重新测一次;二是容易漏测,比如必填参数为空、格式错误这些情况,手动测很容易忘。
而用 JUnit 做接口测试,好处就多了:写一次测试用例,以后每次改代码都能自动跑,哪错了立马告诉你;还能把各种边界情况都写成测试,比如参数为空、长度超限、格式错误,一个都跑不了。咱们开发 Spring Boot 接口,最常用的就是 JUnit 5 配合 Spring Boot Test,这俩是官方搭档,用起来顺手得很。
之前有个粉丝跟我说,他写了个用户注册接口,手动测了正常情况就上线了,结果用户用特殊字符当用户名,直接导致数据库报错。后来用 JUnit 加了各种参数校验的测试,这种问题再也没出过。所以啊,接口测试真不是可有可无的事儿。
二、环境不用愁:Spring Boot 项目自带测试依赖
新手别担心环境配置,Spring Boot 早就帮咱们安排好了。只要你新建项目时勾了 “Spring Boot Starter Test”,依赖就自动加上了,打开 pom.xml 看看,是不是有这段:
xml
<dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-testartifactId><scope>testscope>dependency>这里面不光有 JUnit 5,还有测接口专用的 MockMvc、断言工具,啥都齐了,不用自己瞎折腾。如果是老项目没这个依赖,手动加上再刷新 Maven 就行,超简单。
测试类要放在 src/test/java 目录下,包名最好跟 main 里的接口包对应,比如你的接口在 com.example.demo.controller,测试类就建在 com.example.demo.controller,找起来方便。
三、手把手教你:写第一个接口测试用例
咱们拿个简单的用户接口举例,先有个 Controller 长这样:
java
@RestController@RequestMapping("/users")public class UserController {@GetMapping("/{id}")public ResponseEntity<User> getUser(@PathVariable Long id) {if (id == null || id <= 0) {return ResponseEntity.badRequest().build();}// 模拟查库,实际项目里会调ServiceUser user = new User(id, "测试用户");return ResponseEntity.ok(user);}}现在咱们用 JUnit 写测试,步骤看仔细咯:
第一步,新建测试类,名字叫 UserControllerTest,加上两个注解:
java
@SpringBootTest // 启动Spring上下文@AutoConfigureMockMvc // 自动配置MockMvc,用来发请求public class UserControllerTest {// 注入MockMvc对象@Autowiredprivate MockMvc mockMvc;}这俩注解缺一不可,@SpringBootTest 让测试能加载 Spring 环境,@AutoConfigureMockMvc 帮咱们创建 MockMvc 对象,有了它才能模拟发 HTTP 请求。
第二步,写测试方法,测正常情况和异常情况:
java
@Testvoid testGetUser_Success() throws Exception {// 模拟发GET请求到/users/1mockMvc.perform(get("/users/1") // 请求路径.contentType(MediaType.APPLICATION_JSON)) // 请求类型JSON// 期望返回200状态码.andExpect(status().isOk())// 期望返回的JSON里id是1.andExpect(jsonPath("$.id").value(1))// 期望用户名是“测试用户”.andExpect(jsonPath("$.name").value("测试用户"));}@Testvoid testGetUser_InvalidId() throws Exception {// 测试id为0的情况,期望返回400mockMvc.perform(get("/users/0").contentType(MediaType.APPLICATION_JSON)).andExpect(status().isBadRequest());}这里的
perform()就是发请求,andExpect()是断言结果,比如状态码对不对、返回的 JSON 字段对不对。写完右键运行测试,看到绿色对勾就说明测试通过啦!四、接口测试要注意啥?新手常踩的坑在这
刚开始写测试,这些坑可别踩,兔子哥都替你试过了:
第一个坑,
jsonPath表达式写错。比如想取 name 字段,写成了$.user.name,结果断言失败。记住,jsonPath要跟返回的 JSON 结构对应,咱们返回的是 {"id":1,"name":"测试用户"},直接用$.name就行。第二个坑,忘了加
contentType。发 JSON 请求时,一定要加.contentType(MediaType.APPLICATION_JSON),不然有时候会报 415 错误(不支持的媒体类型),新手很容易在这懵圈。第三个坑,测试方法没加
@Test注解。结果运行的时候方法不执行,还以为代码错了,其实就是漏了个注解,多检查一遍就好。第四个坑,依赖冲突。如果自己加了其他版本的 JUnit 依赖,可能会跟 Spring Boot 自带的冲突,测试跑不起来。解决办法:只保留
spring-boot-starter-test,别自己瞎引其他版本。五、实用小技巧:让接口测试更顺手
写多了测试就会发现,有些小技巧能省不少事:
一是给测试方法起个明白的名字。比如
testGetUser_ValidId_Returns200、testGetUser_NullId_Returns400,一眼就知道测的啥场景,后期维护起来方便。二是用
@BeforeEach初始化数据。如果多个测试方法都需要相同的测试数据,比如创建一个测试用户,可以写在@BeforeEach标注的方法里,每个测试方法运行前都会执行,不用重复写代码。三是打印请求响应。调试的时候加一句
.andDo(print()),会在控制台打印请求和响应详情,方便排查问题:java
mockMvc.perform(get("/users/1")).andDo(print()) // 打印详情.andExpect(status().isOk());六、兔子哥的心里话:测试写得好,上线没烦恼
刚开始写接口测试可能觉得麻烦,尤其是要考虑各种异常情况,脑子都大了。但写着写着你会发现,测试其实帮你理清了接口逻辑,很多开发时没注意的问题,写测试的时候就暴露出来了。
有个朋友跟我说,他以前觉得测试是负担,后来项目大了,改一点代码就怕影响其他功能,现在每次改完代码都跑一遍测试,心里踏实多了。这就是测试的价值啊,不是给你添麻烦,是帮你少出问题。
新手朋友别追求一下子写完美,先从核心接口开始,把正常情况和常见异常测了,慢慢积累经验。用 JUnit 测 Spring Boot 接口真不难,MockMvc 的方法就那么几个,多写两个例子就熟了。
希望这篇教程能帮到刚开始学接口测试的你,别害怕动手,写起来你会发现,原来测试也挺有意思的,而且能让你的代码更靠谱。下次再写接口,记得配上测试用例哦!
标签: org.springframework.boot spring-boot-starter-test
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。
还木有评论哦,快来抢沙发吧~