
前言
軟件測試的重要性毋庸置疑。大部分公司主業(yè)務(wù)的支撐軟件,在開發(fā)時都會要求編寫測試。在日常開發(fā)中,也有不少要求我們寫測試的場景,例如你將要開源擴展包,擁有完整測試永遠是加分項 ??。
項目環(huán)境
- JDK 14
- Gradle 6.3
- macOS 10.15
- SpringBoot 2.3.4
JUnit 介紹
大部分新手在測試程序的時候,喜歡用 System.out.println() 方法,直接把結(jié)果打印出來,看看結(jié)果是否符合預(yù)期。這種方法在測試代碼量很小、邏輯簡單的程序時很方便。在實際生產(chǎn)項目中,我們可以嘗試一下 JUnit 工具。
JUnit 是 Java 語言的測試框架。它可以根據(jù)測試數(shù)據(jù)來驗證程序正確性,并且測試代碼與工程代碼分離。只要在方法上加上 @Test 注解,JUint 就能識別到這個方法。
引入依賴
這里我們使用的構(gòu)建工具是 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);
}
創(chuàng)建 DemoServiceImpl 類,實現(xiàn) DemoService 接口。這里可使用 ? + ? 快速創(chuàng)建接口實現(xiàn)類。
@Service
public class DemoServiceImpl implements DemoService {
@Override
public String sayHelloTo(String name) {
return "say hello to " + name;
}
}
SpringBoot 的單元測試寫在 src/tests 目錄下,如果你使用的是 IDEA IDE,可按下 ? + ? + T 來快速創(chuàng)建測試文件。
@SpringBootTest
class DemoServiceTest {
@Autowired
private DemoService demoService;
@Test
void sayHelloTo() {
String result = demoService.sayHelloTo("developer");
Assertions.assertEquals("say hello to developer", result);
}
}
上面就是最簡單的單元測試寫法,注入 @SpringBootTest 注解即可。想要執(zhí)行的時候,鼠標放在對應(yīng)的方法,右鍵選擇 run。
測試 Controller 層
編寫一份 DemoController,創(chuàng)建一個 sayHelloTo 方法,并且注入 DemoService 接口。
@RestController
public class DemoController {
@Autowired
private DemoService demoService;
@GetMapping("demo")
public String sayHelloTo(String name) {
return demoService.sayHelloTo(name);
}
}
沿用 ? + ? + T 快捷鍵創(chuàng)建控制器測試類,這里用到了 MockMvc,MockMvc 是由 spring-test 包提供,實現(xiàn)了對 HTTP 請求的模擬,能夠直接使用網(wǎng)絡(luò)的形式,轉(zhuǎn)換到 Controller 的調(diào)用,使得測試速度快、不依賴網(wǎng)絡(luò)環(huán)境。同時提供了一套驗證的工具,結(jié)果的驗證十分方便。
@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 以及返回的內(nèi)容,并將整個響應(yīng)結(jié)果輸出出來。
總結(jié)
這里非常簡單的過了一遍 SpringBoot 單元測試流程,也只是作為一個入門實踐記錄在這兒。對 JUnit 和 MockMvc 有了一個最基礎(chǔ)的認識,有興趣的伙伴可以自己查詢一些資料進行深入學習。