前言
软件测试的重要性毋庸置疑。大部分公司主业务的支撑软件,在开发时都会要求编写测试。在日常开发中,也有不少要求我们写测试的场景,例如你将要开源扩展包,拥有完整测试永远是加分项 💯。
项目环境
- JDK 14
- Gradle 6.3
- macOS 10.15
- SpringBoot 2.3.4
JUnit 介绍
大部分新手在测试程序的时候,喜欢用 System.out.println()
方法,直接把结果打印出来,看看结果是否符合预期。这种方法在测试代码量很小、逻辑简单的程序时很方便。在实际生产项目中,我们可以尝试一下 JUnit 工具。
JUnit 是 Java 语言的测试框架。它可以根据测试数据来验证程序正确性,并且测试代码与工程代码分离。只要在方法上加上 @Test
注解,JUint 就能识别到这个方法。
引入依赖
这里我们使用的构建工具是 gradle,所以打开 build.gradle 文件引入依赖。该依赖包含了 JUnit 等,所以无需再单独引入 JUnit。
implementation 'org.springframework.boot:spring-boot-starter-test:2.3.4.RELEASE'
测试 Service 层
编写一份 DemoService 接口,该接口只有一个 sayHelloTo
方法来用于我们简单的单元测试。
public interface DemoService {
/**
* Hello World!
* @param name 名称
* @return String
*/
String sayHelloTo(String name);
}
创建 DemoServiceImpl 类,实现 DemoService 接口。这里可使用 ⌥ + ⏎ 快速创建接口实现类。
@Service
public class DemoServiceImpl implements DemoService {
@Override
public String sayHelloTo(String name) {
return "say hello to " + name;
}
}
SpringBoot 的单元测试写在 src/tests
目录下,如果你使用的是 IDEA IDE,可按下 ⇧ + ⌘ + T 来快速创建测试文件。
@SpringBootTest
class DemoServiceTest {
@Autowired
private DemoService demoService;
@Test
void sayHelloTo() {
String result = demoService.sayHelloTo("developer");
Assertions.assertEquals("say hello to developer", result);
}
}
上面就是最简单的单元测试写法,注入 @SpringBootTest 注解即可。想要执行的时候,鼠标放在对应的方法,右键选择 run。
测试 Controller 层
编写一份 DemoController,创建一个 sayHelloTo
方法,并且注入 DemoService
接口。
@RestController
public class DemoController {
@Autowired
private DemoService demoService;
@GetMapping("demo")
public String sayHelloTo(String name) {
return demoService.sayHelloTo(name);
}
}
沿用 ⇧ + ⌘ + T 快捷键创建控制器测试类,这里用到了 MockMvc,MockMvc 是由 spring-test 包提供,实现了对 HTTP 请求的模拟,能够直接使用网络的形式,转换到 Controller 的调用,使得测试速度快、不依赖网络环境。同时提供了一套验证的工具,结果的验证十分方便。
@AutoConfigureMockMvc
@SpringBootTest
class DemoControllerTest {
@Autowired
private MockMvc mvc;
@Test
public void sayHelloTo() throws Exception {
mvc.perform(MockMvcRequestBuilders.get("/demo?name=developer"))
.andExpect(MockMvcResultMatchers.status().isOk())
.andExpect(MockMvcResultMatchers.content().string("say hello to developer"))
.andDo(MockMvcResultHandlers.print());
}
}
这里简单的使用 MockMvc 测试 API 接口返回的 HTTP STATUS CODE 以及返回的内容,并将整个响应结果输出出来。
总结
这里非常简单的过了一遍 SpringBoot 单元测试流程,也只是作为一个入门实践记录在这儿。对 JUnit 和 MockMvc 有了一个最基础的认识,有兴趣的伙伴可以自己查询一些资料进行深入学习。