前言
Web環(huán)境模擬測試
企業(yè)開發(fā)不僅要保障業(yè)務(wù)層與數(shù)據(jù)層的功能安全有效,也要保障表現(xiàn)層的功能正常。但是我們一般對表現(xiàn)層的測試都是通過postman手工測試的,并沒有在打包過程中代碼體現(xiàn)表現(xiàn)層功能被測試通過。那么能否在測試用例中對表現(xiàn)層進行功能測試呢?答案是可以的,我們可以使用MockMvc來實現(xiàn)它。
1、測試類中啟動web環(huán)境
每一個springboot的測試類上方都會標(biāo)準(zhǔn)@SpringBootTest注解,而注解帶有一個屬性,叫做webEnvironment。通過該屬性就可以設(shè)置在測試用例中啟動web環(huán)境,具體如下:
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class BookControllerTest {
}
測試類中啟動web環(huán)境時,可以指定啟動的Web環(huán)境對應(yīng)的端口,springboot提供了4種設(shè)置值,分別如下:
- MOCK:根據(jù)當(dāng)前設(shè)置確認(rèn)是否啟動web環(huán)境,例如使用了Servlet的API就啟動web環(huán)境,屬于適配性的配置
- DEFINED_PORT:使用自定義的端口作為web服務(wù)器端口
- RANDOM_PORT:使用隨機端口作為web服務(wù)器端口
- NONE:不啟動web環(huán)境
建議大家測試時使用RANDOM_PORT,避免項目打包運行時由于端口沖突導(dǎo)致意外現(xiàn)象的出現(xiàn)。
2、測試類中發(fā)送請求
單元測試(MockMvc)
1、mockMvc.perform執(zhí)行一個請求;
2、MockMvcRequestBuilders.get("/user/1")構(gòu)造一個請求
3、ResultActions.andExpect添加執(zhí)行完成后的斷言
4、ResultActions.andDo添加一個結(jié)果處理器,表示要對結(jié)果做點什么事情,比如此處使用MockMvcResultHandlers.print()輸出整個響應(yīng)結(jié)果信息。
5、ResultActions.andReturn表示執(zhí)行完成后返回相應(yīng)的結(jié)果。
MockMvcBuilder是用來構(gòu)造MockMvc的構(gòu)造器,其主要有兩個實現(xiàn):StandaloneMockMvcBuilder和DefaultMockMvcBuilder,StandaloneMockMvcBuilder繼承了DefaultMockMvcBuilder。直接使用靜態(tài)工廠MockMvcBuilders創(chuàng)建即可:
MockMvcBuilders.webAppContextSetup(WebApplicationContext context):指定WebApplicationContext,將會從該上下文獲取相應(yīng)的控制器并得到相應(yīng)的MockMvc;
MockMvcBuilders.standaloneSetup(Object... controllers):通過參數(shù)指定一組控制器,這樣就不需要從上下文獲取了;
MockMvcRequestBuilders主要API:
MockHttpServletRequestBuilder get(String urlTemplate, Object... urlVariables):根據(jù)uri模板和uri變量值得到一個GET請求方式的MockHttpServletRequestBuilder;如get("/user/{id}", 1L);
MockHttpServletRequestBuilder post(String urlTemplate, Object... urlVariables):同get類似,但是是POST方法;
MockHttpServletRequestBuilder put(String urlTemplate, Object... urlVariables):同get類似,但是是PUT方法;
MockHttpServletRequestBuilder delete(String urlTemplate, Object... urlVariables) :同get類似,但是是DELETE方法;
ResultActions
- 調(diào)用MockMvc.perform(RequestBuilder requestBuilder)后將得到ResultActions,通過ResultActions完成如下三件事:
- ResultActions andExpect(ResultMatcher matcher) :添加驗證斷言來判斷執(zhí)行請求后的結(jié)果是否是預(yù)期的;
- ResultActions andDo(ResultHandler handler) :添加結(jié)果處理器,用于對驗證成功后執(zhí)行的動作,如輸出下請求/結(jié)果信息用于調(diào)試;
- MvcResult andReturn() :返回驗證成功后的MvcResult;用于自定義驗證/下一步的異步處理;(主要是拿到結(jié)果進一步做自定義斷言)
我們該在測試類中如何發(fā)送請求呢?具體操作如下:
步驟①:在測試類中開啟web虛擬調(diào)用功能,通過注解@AutoConfigureMockMvc實現(xiàn)此功能的開啟。
步驟②:定義發(fā)起虛擬調(diào)用的對象MockMVC,通過自動裝配的形式初始化對象。
步驟③:創(chuàng)建一個虛擬請求對象,封裝請求的路徑,并使用MockMVC對象發(fā)送對應(yīng)請求
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
@AutoConfigureMockMvc
public class BookControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
public void getBooks() throws Exception {
//創(chuàng)建虛擬請求,當(dāng)前訪問/books
MockHttpServletRequestBuilder requestBuilder =
MockMvcRequestBuilders.get("/books");
//執(zhí)行對應(yīng)的請求
mvc.perform(requestBuilder);
}
}
注意訪問路徑不要寫
http://localhost:8080/books,因為前面的服務(wù)器IP地址和端口使用的是當(dāng)前虛擬的web環(huán)境,無需指定,僅指定請求的具體路徑即可。
另外:測試用例如果測試時產(chǎn)生了事務(wù)提交就會在測試過程中對數(shù)據(jù)庫數(shù)據(jù)產(chǎn)生影響,進而產(chǎn)生垃圾數(shù)據(jù)。這個過程不是我們希望發(fā)生的,如何避免呢?
我們只需要在原始測試用例中添加注解@Transactional即可實現(xiàn)當(dāng)前測試用例的事務(wù)不提交。當(dāng)程序運行后,只要注解@Transactional出現(xiàn)的位置存在注解@SpringBootTest,springboot就會認(rèn)為這是一個測試程序,無需提交事務(wù),所以也就可以避免事務(wù)的提交。
當(dāng)然,這里我們也可以使用h2數(shù)據(jù)庫來做測試;具體詳情可以查看:文章來源:http://www.zghlxwxcb.cn/news/detail-853040.html
SpringBoot+MockMvc+H2 自動化單元測試的示例代碼https://download.csdn.net/download/A_aspectJ/88879412?spm=1001.2014.3001.5503SpringBoot+MockMvc+H2 自動化單元測試的例代碼開發(fā)過程總結(jié)文章來源地址http://www.zghlxwxcb.cn/news/detail-853040.html
總結(jié):
- 在測試類中測試web層接口要保障測試類啟動時啟動web容器,使用@SpringBootTest注解的webEnvironment屬性可以虛擬web環(huán)境用于測試
- 為測試方法注入MockMvc對象,通過MockMvc對象可以發(fā)送虛擬請求,模擬web請求調(diào)用過程
- web虛擬調(diào)用可以對本地虛擬請求的返回響應(yīng)信息進行比對,分為響應(yīng)頭信息比對、響應(yīng)體信息比對、響應(yīng)狀態(tài)信息比對。
到了這里,關(guān)于Spring Boot 自動化單元測試類的編寫過程的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!