SpringBoot微服務應用使用JUint5做介面測試
SpringBoot2.x中我們可以很方便地整合Junit5.x進行介面測試和單元測試。本節內容主要說一下介面測試。
第一步,引入依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency>
沒錯只需要這一個依賴足以。
第二步,我們可以針對Controller生成測試類。
這裡講一下IDEA中的步驟:
1、開啟Controller類
2、游標定位在類名上
3、按Alt+Enter
4、選擇“Create Test”
5、勾選要進行介面測試的方法
6、確定,即可自動生成測試類
自動生成的測試儀器如下圖:
第三步,添加註解支撐。
在我們的測試類上添加註解:
package com.xtoad.ecms.baseinfo.controller;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.annotation.Rollback;import org.springframework.test.context.junit.jupiter.SpringExtension;import org.springframework.transaction.annotation.Transactional;import static org.junit.jupiter.api.Assertions.*;@SpringBootTest@ExtendWith(SpringExtension.class)@AutoConfigureMockMvc@Transactional@Rollback(value = false)class UserControllerTest { @Test void getAllUser() { } @Test void getUserById() { } @Test void getUserWithName() { } @Test void insertUser() { } @Test void updateUser() { } @Test void deleteUser() { } @Test void batchAddUser() { } @Test void batchUpdUser() { } @Test void batchDelUser() { }}
各個註解的含義如下:
@SpringBootTest
啟動SpringBoot工程,並且測試程式碼中可以使用Spring容器自動注入等操作,若無此此註解,則不會啟動SpringBoot工程
@ExtendWith(SpringExtension.class)
啟用在測試中使用Spring測試框架功能(例如)`@MockBean`
@AutoConfigureMockMvc
開啟自動配置MockMvc,用於介面請求
@Transactional
開啟事務,這樣測試程式碼執行完畢會自動回滾所有的資料庫變更,這樣不會影響我們實際使用的資料
@Rollback(value = false)
該註解可以讓事務不回滾,會保留介面測試的資料庫變更,預設是true
接著我們可以寫介面測試程式碼了。
核心物件有兩個:MockMvc和RequestBuilder。
RequestBuilder:用於構建一個Http請求,包含請求的Url,Method,ContentType,Header,Body等。
MockMvc:用於介面請求的傳送和接收返回,自動會請求當前Springboot應用的服務。
下面以其中一個介面為例:
package com.xtoad.ecms.baseinfo.controller;import com.fasterxml.jackson.core.type.TypeReference;import com.xtoad.ecms.baseinfo.dto.RoleDTO;import com.xtoad.ecms.baseinfo.dto.UserDTO;import com.xtoad.ecms.baseinfo.enums.Sex;import com.xtoad.ecms.common.utils.JsonUtils;import com.xtoad.ecms.common.web.base.Result;import org.junit.jupiter.api.Test;import org.junit.jupiter.api.extension.ExtendWith;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit.jupiter.SpringExtension;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.MvcResult;import org.springframework.test.web.servlet.RequestBuilder;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.transaction.annotation.Transactional;import java.util.ArrayList;import java.util.List;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.jsonPath;import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;@SpringBootTest@ExtendWith(SpringExtension.class)@AutoConfigureMockMvc@Transactionalclass UserControllerTest { private static final Logger LOGGER = LoggerFactory.getLogger(UserControllerTest.class); @Autowired private MockMvc mockMvc; // 測試介面的Url private String baseUrl = "/user"; @Test void getUserById() throws Exception { // 測試介面的請求引數 String url = baseUrl + "/1"; // 建立Http請求物件 RequestBuilder request = MockMvcRequestBuilders.get(url) // Method:GET Url:/user/1 .accept(MediaType.APPLICATION_JSON) // Accept:application/json .header("TOKEN", "tokenstring") // 設定Header .content("") // Body:空 .contentType(MediaType.APPLICATION_JSON); // ContentType:application/json // 發起介面請求並驗證結果 MvcResult mvcResult = this.mockMvc.perform(request) // 傳送請求 .andExpect(status().isOk()) // 驗證返回的http Status = 200 .andExpect(content().contentType(MediaType.APPLICATION_JSON_UTF8)) // 驗證返回結果型別是application/json;charset=UTF-8 .andDo(MockMvcResultHandlers.print()) // 列印返回結果 .andExpect(jsonPath("$.code").value("000000")) // 驗證返回結果中的code == 000000 .andExpect(jsonPath("$.data.id").value(1))// 驗證返回結果中的data 物件中的id == 1 .andReturn(); LOGGER.info(mvcResult.getResponse().getContentAsString()); }}
我們執行測試方法:
執行結果如下:
完整原始碼地址:https://gitee.com/xtoad/ecms-java.git