文章目錄
- 一、 單元測驗的概念
- 二、單元測驗的作用
- 三、Spring Boot引入的MockMvc的概念
- 四、Service層的單元測驗
- 五、Controller層的單元測驗
- 六、斷言的概念
- 七、新斷言assertThat使用
- 八、Postman與Spring Boot 單元測驗的區別
- 九、Postman基本用法
一、 單元測驗的概念
概念:
- 單元測驗(unit testing),是指對軟體中的最小可測驗單元進行檢查和驗證,在Java中單元測驗的最小單元是類,
- 單元測驗是開發者撰寫的一小段代碼,用于檢驗被測代碼的一個很小的、很明確的功能是否正確,執行單元測驗,就是為了證明這 段代碼的行為和我們期望是否一致,
單元測驗參考:
- 眾所周知,通過
spring initialize創建的Spring Boot專案會在Maven中自動攜帶很多starter依賴:

其中包含了一個名為spring-boot-starter-test的依賴,本文是圍繞這個依賴展開,
- Spring Boot中引入單元測驗很簡單,添加如下依賴(即
spring-boot-starter-test依賴):
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
- spring-boot-starter-test有如下幾個庫:
spring-boot-starter-testUML圖:

| 序號 | 庫名的解釋 |
|---|---|
| 1 | JUnit 5:包含兼容 JUnit 4,Java 應用程式單元測驗的事實標準 |
| 2 | Spring Test 和 SpringBootTest:對Spring Boot應用程式的公共和集成測驗支持 |
| 3 | AssertJ:流式斷言庫 |
| 4 | Hamcrest:匹配物件庫 |
| 5 | Mockito:Java 模擬框架 |
| 6 | JSONassert:JSON 斷言庫 |
| 7 | JsonPath:JSON XPath |
二、單元測驗的作用
在沒有接觸單元測驗之前我們是怎么做測驗的?一般有兩個方法:
| 方法 | 弊端 |
|---|---|
| 方法一:啟動整個應用,像用戶正常操作一樣,點擊界面按鈕,呼叫一個 API 等, | 每次測驗都要啟動整個專案 |
| 方法二:在代碼某個地方寫一個臨時入口,例如 java 的 main 方法,測驗某個方法或者某個類, | 入口用完要洗掉,不然會影響專案的運行速度或效率 |
在時間允許的情況下,撰寫單元測驗是程式員對代碼的自測,這是對自己代碼的負責,
寫單元測驗的兩個動機:
- 保證或驗證實作功能,
- 保護已經實作的功能不被破壞,
三、Spring Boot引入的MockMvc的概念
- 什么是Mock?
在面向物件的程式設計中,模擬物件(英語:mock object)是以可控的方式模擬真實物件行為的假物件,在編程程序中,通常通過模擬一些輸入資料,來驗證程式是否達到預期結果,
- 為什么使用Mock物件?
使用模擬物件,可以模擬復雜的、真實的物件行為,如果在單元測驗中無法使用真實物件,可采用模擬物件進行替代,
- MockMvc的概念
MockMvc是由spring-test包提供,實作了對Http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,使得測驗速度快、不依賴網路環境,同時提供了一套驗證的工具,結果的驗證十分方便,
介面MockMvcBuilder,提供一個唯一的build方法,用來構造MockMvc,主要有兩個實作:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,
| 實體化方法 | 實體&解釋 |
|---|---|
| 方法一 | mockMvc = MockMvcBuilders.standaloneSetup(new HelloWorldController()).build();通過引數指定一組控制器,這樣就不需要從背景關系獲取了 |
| 方法二 | mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();指定WebApplicationContext,將會從該背景關系獲取相應的控制器并得到相應的MockMvc |
- MockMVC的基本步驟
(1) mockMvc.perform執行一個請求,
(2) MockMvcRequestBuilders.get(“XXX”)構造一個請求,
(3) ResultActions.param添加請求傳值
(4) ResultActions.accept()設定回傳型別
(5) ResultActions.andExpect添加執行完成后的斷言,
(6) ResultActions.andDo添加一個結果處理器,表示要對結果做點什么事情,比如處使用print()輸出整個回應結果資訊,
(7) ResultActions.andReturn表示執行完成后回傳相應的結果,
四、Service層的單元測驗
(以下圖片均引自文末學習文章,因為公司專案不方便截圖)第一步:Spring Boot中單元測驗類寫在src/test/java目錄下,你可以手動創建具體測驗類,也可以通過IDEA自動創建測驗類,如下圖:(注:點選并打開相應代碼界面,再點擊選單欄的Navigate)

圖一

圖二


Service層測驗代碼如下:
@SpringBootTest
@RunWith(SpringRunner.class)
public class XXXServiceTest {
@Resource
private XXXService XXXService;
@Test
public void conflictTime() {
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate start = LocalDate.parse("2020-10-26", dtf);
LocalDate end = LocalDate.parse("2020-10-31", dtf);
Integer integer = XXXService.ConflictTime("10000001", start, end);
Assert.assertThat(integer, Matchers.notNullValue());//assertThat斷言后面介紹
}
}
注解解釋:
@SpringBootTest:獲取啟動類,加載配置,尋找主配置啟動類(被 @SpringBootApplication 注解的)
@RunWith(SpringRunner.class):讓JUnit運行Spring的測驗環境,獲得Spring環境的背景關系的支持
五、Controller層的單元測驗
創建測驗類步驟見第四部分,此處略,- 第四部分只是針對Service層做了測驗,但是咱么也需要對Controller層(API)做測驗,這時候就用到MockMvc了,它使得你無需啟動專案工程就能測驗這些介面,
- MockMvc實作了對Http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,這樣可以使得測驗速度快、不依賴網路環境,而且提供了一套驗證的工具,這樣可以使得請求的驗證統一而且很方便,
Controller層部分的代碼小名將分為三個代碼塊講解,里面有看不懂的代碼先不要著急哦😄,小名會在第五部分結尾處給大家匯總解答的,大家要堅持看到最后喲!😁
代碼塊一:
@SpringBootTest
@RunWith(SpringRunner.class)
@AutoConfigureMockMvc
public class DfTaskRecordControllerTest {
@Autowired
private MockMvc mockMvc;
@Before
public void setUp() throws Exception {
System.out.println("---------------start---------------");
save();
get();
System.out.println("================end================");
}
注解解釋:
@SpringBootTest>:獲取啟動類,加載配置,尋找主配置啟動類(被 @SpringBootApplication 注解的)
@RunWith(SpringRunner.class)>:讓JUnit運行Spring的測驗環境,獲得Spring環境的背景關系的支持
@AutoConfigureMockMvc:用于自動配置MockMvc,配置后MockMvc類可以直接注入,相當于new MockMvc
@Before:初始化方法 ,對于每一個測驗方法都要執行一次
代碼塊二:
@Test
@Transactional
@Rollback()
public void save() throws Exception {
String json"{……}";
//執行一個RequestBuilder請求,會自動執行SpringMVC的流程并映射到相應的控制器執行處理;
mockMvc.perform(MockMvcRequestBuilders
.post("/XXX/save")
.content(json.getBytes()) //傳json引數
.accept(MediaType.APPLICATION_JSON)
.contentType(MediaType.APPLICATION_JSON_VALUE)
.header("Authorization","Bearer ********-****-****-****-************")
)
.andExpect(MockMvcResultMatchers.status().isOk())
.andDo(print());
}
注解解釋:
@Transactional:開啟事務功能
@Rollback(): 事務回滾,默認是true
代碼塊三:
@Test
public void get() throws Exception{
ResultActions resultActions = mockMvc.perform(MockMvcRequestBuilders
.get("/XXX/get")
.param("id", "**********")
.header("Authorization", "Bearer ********-****-****-****-************")
);
resultActions.andReturn().getResponse().setCharacterEncoding("UTF-8");
resultActions.andExpect(MockMvcResultMatchers.status().isOk()).andDo(print());
}
}
/get運行結果如下:

現在小名將上面的一些瑣碎的知識點匯總一下:
mockMvc.perform:執行一個請求MockMvcRequestBuilders.get(“/XXX/get”):構造一個請求,Post請求使用.post方法contentType(MediaType.APPLICATION_JSON_VALUE):代表發送端發送的資料格式是application/json;charset=UTF-8accept(MediaType.APPLICATION_JSON):代表客戶端希望接受的資料型別為application/json;charset=UTF-8header(“Authorization”,“Bearer XXXX”):代表在報文頭添加一些必須的資訊,這里添加的是tokenResultActions.andExpect:添加執行完成后的斷言ResultActions.andExpect(MockMvcResultMatchers.status().isOk()):方法看請求的狀態回應碼是否為200如果不是則拋例外,測驗不通過ResultActions.andDo:添加一個結果處理器,表示要對結果做點什么事情,比如此處使用print():輸出整個回應結果資訊
六、斷言的概念
- 斷言(assert),是編程術語,表示為一些布爾運算式,程式員相信在程式中的某個特定點該運算式值為真,可以在任何時候啟用和禁用斷言驗證,因此可以在測驗時啟用斷言而在部署時禁用斷言,
- 使用斷言是判斷一個函式或物件的一個方法所產生的結果是否符合你期望的那個結果,
七、新斷言assertThat使用
JUnit 4.4 結合 Hamcrest 提供了一個全新的斷言語法——assertThat,程式員可以只使用 assertThat 一個斷言陳述句,結合 Hamcrest 提供的匹配符,就可以表達全部的測驗思想,assertThat 的優點:
優點 1:以前 JUnit 提供了很多的 assertion 陳述句,如:assertEquals,assertNotSame,assertFalse,assertTrue,assertNotNull,assertNull 等,現在有了 JUnit 4.4,一條 assertThat 即可以替代所有的 assertion 陳述句,這樣可以在所有的單元測驗中只使用一個斷言方法,使得撰寫測驗用例變得簡單,代碼風格變得統一,測驗代碼也更容易維護,
優點 3:assertThat 不再像 assertEquals 那樣,使用比較難懂的“謂賓主”語法模式(如:assertEquals(3, x);),相反,assertThat 使用了類似于“主謂賓”的易讀語法模式(如:assertThat(x,is(3));),使得代碼更加直觀、易讀,
assertThat 的基本語法如下:
assertThat( [value], [matcher statement] );
value :接下來想要測驗的變數值;
matcher statement :使用 Hamcrest 匹配符來表達的對前面變數所期望的值的宣告,如果 value 值與 matcher statement 所表達的期望值相符,則測驗成功,否則測驗失敗,
八、Postman與Spring Boot 單元測驗的區別
- Spring Boot的單元測驗主要針對方法層面,可以測驗Service層這類非對外暴露的介面的類中方法,并且可一次性批量測驗多個方法、支持事務回滾,
- Postman針對介面進行http測驗,我平時這個比較多,創建的測驗介面可保存、分類,
九、Postman基本用法
Postman是一款功能強大的網頁除錯與發送網頁HTTP請求的工具,Postman能夠發送任何型別的HTTP請求(GET, HEAD, POST,PUT..),附帶任何數量的引數和HTTP headers,支持不同的認證機制(basic, digest,OAuth),接收到的回應語法高亮(HTML,JSON或XML),安裝Postman 官方網站:https://www.getpostman.com/apps


學習文章:
Spring Boot干貨系列:(十二)Spring Boot使用單元測驗
SpringBoot | 第十五章:基于Postman的RESTful介面測驗
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/247213.html
標籤:其他
上一篇:c語言刷題篇易錯
