來源:eamonyin.blog.csdn.net
一、 單元測驗的概念
概念:
-
單元測驗(unit testing),是指對軟體中的最小可測驗單元進行檢查和驗證,在Java中單元測驗的最小單元是類,
-
單元測驗是開發者撰寫的一小段代碼,用于檢驗被測代碼的一個很小的、很明確的功能是否正確,執行單元測驗,就是為了證明這 段代碼的行為和我們期望是否一致,
單元測驗參考:
眾所周知,通過spring initialize創建的Spring Boot專案會在Maven中自動攜帶很多starter依賴:

其中包含了一個名為spring-boot-starter-test的依賴,本文是圍繞這個依賴展開,
Spring Boot 基礎就不介紹了,推薦看這個免費教程:
https://github.com/javastacks/spring-boot-best-practice
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圖:


二、單元測驗的作用
在沒有接觸單元測驗之前我們是怎么做測驗的?一般有兩個方法:

在時間允許的情況下,撰寫單元測驗是程式員對代碼的自測,這是對自己代碼的負責,
寫單元測驗的兩個動機:
-
保證或驗證實作功能,
-
保護已經實作的功能不被破壞,
三、Spring Boot引入的MockMvc的概念
什么是Mock?
在面向物件的程式設計中,模擬物件(英語:mock object)是以可控的方式模擬真實物件行為的假物件,在編程程序中,通常通過模擬一些輸入資料,來驗證程式是否達到預期結果,
為什么使用Mock物件?
使用模擬物件,可以模擬復雜的、真實的物件行為,如果在單元測驗中無法使用真實物件,可采用模擬物件進行替代,
MockMvc的概念
MockMvc是由spring-test包提供,實作了對Http請求的模擬,能夠直接使用網路的形式,轉換到Controller的呼叫,使得測驗速度快、不依賴網路環境,同時提供了一套驗證的工具,結果的驗證十分方便,
介面MockMvcBuilder,提供一個唯一的build方法,用來構造MockMvc,主要有兩個實作:StandaloneMockMvcBuilder和DefaultMockMvcBuilder,

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)

第二步:
按照第一步的方法,點擊測驗后,出現圖一 的對話框(如果想要測驗的類已經存在測驗類了會被列出來,也可以重新創建一個新的測驗類),點擊”Create New Test…”會彈出圖二 的對話框,可以選擇是否生成setUp以及要測驗的成員方法等:


第三步:
至此Service層的測驗類就創建好了,測驗類自動生成到了src/test/java目錄下專案的同級目錄中 ,如下圖:

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環境的背景關系的支持,
推薦一個開源免費的 Spring Boot 最全教程:
https://github.com/javastacks/spring-boot-best-practice
五、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運行結果如下:

現在將上面的一些瑣碎的知識點匯總一下:
1. mockMvc.perform:執行一個請求
2. MockMvcRequestBuilders.get(“/XXX/get”):構造一個請求,Post請求使用.post方法
3. contentType(MediaType.APPLICATION_JSON_VALUE):代表發送端發送的資料格式是application/json;charset=UTF-8
4. accept(MediaType.APPLICATION_JSON):代表客戶端希望接受的資料型別為application/json;charset=UTF-8
5. header(“Authorization”,“Bearer XXXX”):代表在報文頭添加一些必須的資訊,這里添加的是token
6. ResultActions.andExpect:添加執行完成后的斷言
7. ResultActions.andExpect(MockMvcResultMatchers.status().isOk()):方法看請求的狀態回應碼是否為200如果不是則拋例外,測驗不通過
8. 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 陳述句,這樣可以在所有的單元測驗中只使用一個斷言方法,使得撰寫測驗用例變得簡單,代碼風格變得統一,測驗代碼也更容易維護,
優點 2: assertThat 使用了 Hamcrest 的 Matcher 匹配符,用戶可以使用匹配符規定的匹配準則精確的指定一些想設定滿足的條件,具有很強的易讀性,而且使用起來更加靈活,
優點 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

安裝后,Postman是介樣嬸兒滴~~??

近期熱文推薦:
1.1,000+ 道 Java面試題及答案整理(2022最新版)
2.勁爆!Java 協程要來了,,,
3.Spring Boot 2.x 教程,太全了!
4.別再寫滿屏的爆爆爆炸類了,試試裝飾器模式,這才是優雅的方式!!
5.《Java開發手冊(嵩山版)》最新發布,速速下載!
覺得不錯,別忘了隨手點贊+轉發哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544399.html
標籤:Java
