天天看點

單元測試(Spring)前期準備普通測試隔離測試Maven運作指令JUnit插件

單元測試是指對軟體中的最小可測試單元進行的檢查和驗證,是軟體開發過程中要進行的最低級别的測試活動,軟體的獨立單元将在與程式的其他部分相隔離的情況下進行測試。

單元測試好處:提高代碼品質(實作功能、邏輯嚴密)、減少調試時間、隔離測試。

單元測試工具類很多,一般選擇流行的Junit和Mockito進行測試示範。如果進行普通組合測試可不用Mockito,隔離測試則需用到Mockito。

首先,引入相關Jar包 --- Junit 和 org.mockito。如果是使用Maven工程,則需在pom.xml檔案中引入依賴。參考樣式如下:

其次,建立測試類。可通過JUnit工具生成測試類(可設定生成的測試類位置),也可手動建立。一般情況,建議一個java類對應一個測試類,但如果需針對一個方法進行多方面測試,則可針對一個類中一個方法建立一個測試類。例如:測試找不到控制器,404測試、驗證請求參數綁定、驗證請求參數驗證失敗、JSON請求、響應異常處理等等。

普通測試是将整個大的子產品整體一起測試。如目标測試Controller層,但Control層依賴Service層,而Service層又依賴DAO層,則我們對Controller進行普通測試時,便連同Serice層和DAO層也一起測試了。

正常步驟:(1)參數指派  (2)寫出期望值  (3)擷取實際值  (4)斷言 --- 比較期望值與實際值是否相同

@WebAppConfiguration:測試環境使用,表示測試環境使用的ApplicationContext是WebApplicationContext類型的。@WebAppConfiguration(value = "src/main/webapp") 中value指定web應用的根;

@ContextConfiguration:指定Spring配置檔案或者配置類的位置;

@RunWith(SpringJUnit4ClassRunner.class):啟動Spring對測試類的支援;

@TransactionConfiguration(transactionManager="transactionManager", defaultRollback=true):啟用自動的事務管理,事務復原;

@Autowired:自動織入 Spring 的 bean 用來測試;

@Before:每個方法測試前調用。一般用于public void setup() { mockMvc=MockMvcBuilders.standaloneSetup(wac).build();}前面;

@Test:測試方法,表明這是一個測試方法。在Junit中将會自動被執行。

MockMvc:在setUp(){}方法中,通過MockMvcBuilders.webAppContextSetup(wac).build()建立一個MockMvc進行測試;

mockMvc.perform():執行一個請求;

MockMvcRequestBuilders.post(url).param("param1", param1):構造一個請求,請求可傳帶參數;

ResultActions.andExpect():添加執行完成後的斷言,ResultMatcher驗證規則,驗證控制器執行完成後結果是否正确;

ResultActions.andDo():添加一個結果處理器,表示要對結果做點什麼事情,比如此處使用MockMvcResultHandlers.print()輸出整個響應結果資訊;

ResultActions.andReturn():表示執行完成後傳回相應的結果;

Assert.  :通過靜态方法執行斷言,判斷測試結果與預期是否相同。

對于Service、DAO僅僅是測試用,則需要加上事務復原

對Service、DAO的測試相對于Controller來說要簡單很多,大部分内容都在Controller裡面講過,不同的地方就是Controller是使用mockMvc對象來模拟Controler的被測方法,而在Service的單元測試中則是直接調用Service的方法。

針對DAO層測試方法和Service層測試方法類似。

參數化測試主要是用于測試分支語句,多個參數覆寫if…else等判斷語句中的分支,使測試更全面。

參數化測試五個步驟:

(1)為準備使用參數化測試的測試類指定特殊的運作器org.junit.runners.Parameterized;

(2)為測試類聲明幾個變量,分别用于存放期望值和測試所用資料;

(3)為測試類聲明一個帶有參數的公共構造函數,并在其中為第二個環節中聲明的幾個變量指派;

(4)為測試類聲明一個使用注解org.junit.runners.Parameterized.Parameters修飾的,傳回值為 java.util.Collection的公共靜态方法,并在此方法中初始化所有需要測試的參數對;

(5)編寫測試方法,使用定義的變量作為參數進行測試。

除了普通的整體測試之外,我們經常要用到的隔離測試,也即是防止多類之間依賴的測試。例如當測試Controller層時,Controller層依賴Service層,而Service層又依賴于DAO層。這時,可以利用Mockito來進行隔離,單獨測試Controller。

主要思想是利用Mockito --- 模拟。(需導入import org.mockito.Mockito;)

模拟對象

模拟方法調用的傳回值

模拟方法調用的參數比對

模拟方法調用抛出異常

要做到隔離,就得模拟其依賴部分。當測試方法需調用依賴方法時便傳回模拟值,進而達到隔離測試的目的。

可以通過在指令行中輸入指令來運作所有的測試用例,指令如下:

可以直接在指令行中輸入動态指令來運作指定的測試用例,指令如下:

也可以使用通配符,也可以使用“,”指定多個測試類,如下所示:

指定測試方法: 使用#指定測試方法,使用*通配測試方法,使用+号指定一個類中的多個測試方法

一些常用的IDE工具都帶有JUnit插件,如Eclipse、 IntelliJ IDEA。

Eclipse:選中要運作的類(或光标放在要運作的測試方法上) --> 點選右鍵 --> Run as --> JUnit 即可運作。

IDEA:選中要運作的類(或光标放在要運作的測試方法上) --> 點選右鍵 --> Run。