JAVA自動化之Junit單元測試框架詳解
- 2020 年 4 月 14 日
- 筆記
- API介面自動化測試, APP移動端自動化測試, WEB自動化測試
一、JUnit概述&配置
1、Junit是什麼?
Junit是一個Java 程式語言的開源測試框架,用於編寫和運行測試。官網 地址://junit.org/junit4/
2、Maven配置
二、Assertions 斷言
JUnit提供了一些輔助的函數,用來判斷被測試的方法是否如我們預期的效果一樣正常執行。這些輔助函數被稱之為斷言。
常用斷言:
方法 | 示例 | 功能 |
---|---|---|
assertArrayEquals | assertArrayEquals(“message”, expected, actual); | 判斷兩個數組是否相等 |
assertEquals | assertEquals(“message”, “text”, “text”); | 判斷兩個對象是否相等 |
assertFalse | assertFalse(“failure – should be false”, false); | 判斷表達式是否為false |
testAssertTrue | assertTrue(“failure – should be true”, true); | 判斷表達式是否為true |
assertNotNull | assertNotNull(“should not be null”, new Object()); | 判斷是否非空 |
assertNull | assertNull(“should be null”, null); | 判斷是否為空 |
assertNotSame | assertNotSame(“should not be same Object”, new Object(), new Object()); | 判斷是否為不同對象 |
assertSame | assertSame(“should be same”, aNumber, aNumber); | 判斷是否為同一對象 |
…… | …… | …… |
三、Test Runners 測試運行器
JUnit中所有的測試方法都是由測試運行器負責執行。當一個類被@RunWith注釋或拓展了一個@RunWith注釋的類,JUnit將會使用引用的類來執行測試,而不是使用JUnit內置的運行器。
Specialized Runners:
Suite:Suite是一個標準的運行器,允許手動構建包含來自許多類的測試集。
Parameterized:Parameterized是一個實現參數化測試的標準運行器。運行參數化測試類時,測試方法和測試數據進行合併來創建測試實例。
Categories:Categories運行器來制定分類,定義測試被包含或排除。
四、Aggregating tests in suites 套件
測試套件用於捆綁幾個單元測試用例並且一起執行他們,使用@RunWith 和 @Suite 註解。
五、Test execution order 執行順序
要改變測試執行的順序只需要在測試類上使用 @FixMethodOrder註解,並指定一個可用的MethodSorter即可:
@FixMethodOrder(MethodSorters.DEFAULT):JUnit默認使用一個確定的,但不可預測的順序
@FixMethodOrder(MethodSorters.JVM): 保留測試方法的執行順序為JVM返回的順序,每次測試的執行順序有可能會所不同
@FixMethodOrder(MethodSorters.NAME_ASCENDING):根據測試方法的方法名排序,按照詞典排序規則(ASC從小到大遞增)
運行結果:
六、Expected Exceptions 異常測試
用於測試某一方法是否拋出了正確的異常。
1、@Test(expected=xxx)方式:當拋出的異常與expected參數指定的異常相同時,測試通過。
2、try…fail…catch…方式:捕捉具體待測語句的異常資訊並斷言,當沒有異常被拋出的時候fail方法會被調用,輸出測試失敗的資訊。
3、ExpectedException Rule方式:使用Rule標記來指定一個ExpectedException,並在測試相應操作之前指定期望的Exception類型。
七、Matchers and assertThat
JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher,這些匹配符更接近自然語言,可讀性高,更加靈活。並且使用全新的斷言語法assertThat,結合Hamcrest提供的匹配符,只用這一個方法,就可以實現所有的測試。
assertThat語法:
assertThat(T actual, Matcher matcher);
assertThat(String reason, T actual, Matcher matcher);
其中reason為斷言失敗時的輸出資訊,actual為斷言的值或對象,matcher為斷言的匹配器,裡面的邏輯決定了給定的actual對象滿不滿足斷言。
Matchers詳見:
//hamcrest.org/JavaHamcrest/javadoc/1.3/org/hamcrest/Matchers.html
八、Ignoring tests 忽略測試
- 方法用 @Ignore 註解了將不會被執行
- 類用 @Ignore 註解後,其下所有測試方法將不會被執行
九、Timeout for tests 超時測試
@Timeout 註解用來測試特定方法的執行時間。如果測試方法的執行時間大於指定的超時參數,測試方法將拋出異常,測試結果為失敗。指定的超時參數單位為毫秒。
1、@Test註解上的timeout參數,作用域為方法,單位毫秒
2、Timeout Rule,作用域為測試類
十、Parameterized tests 參數化測試
參數化測試允許開發人員使用不同的值反覆運行同一個測試。創建參數化測試步驟:
- 用 @RunWith(Parameterized.class) 來注釋 test 類。
- 創建一個由 @Parameters 注釋的公共的靜態方法,它返回一個對象的集合(數組)來作為測試數據集合。
- 創建一個公共的構造函數,接受測試數據。
- 為每一列測試數據創建一個實例變數。
- 用實例變數作為測試數據的來源來創建測試用例。
1、Constructor方式
2、Field injection方式
十一、Assumptions with assume 假定測試
使用Assumptions類中的假設方法時,當假設不成立時會報錯,但是測試會顯示被ignore忽略執行。也就是當一個類中有多個測試方法時,其中一個假設測試方法假設失敗,其他的測試方法全部成功,那麼該測試類也會顯示測試成功。
假設方法適用於:在不影響測試是否成功的結果的情況下根據不同情況執行相關程式碼。
以下語法JUnit5支援:
十二、Rules 規則
一個JUnit Rule就是一個實現了TestRule的類,用來在每個測試方法的執行前後執行一些程式碼。
1、框架自帶的Rule
JUnit自帶很多已經實現過好了的JUnit Rule,比如Timeout,ExpectedException等等。
2、自定義Rule
自定義一個Rule就是implement一個TestRule interface,實現一個叫apply()的方法。
例:在測試方法運行之前,記錄測試方法所在的類名和方法名,然後在測試方法運行之後列印出來。
十三、Theories
在參數化測試中,我們需要給定所有具體的測試數據組。而在Theories測試中,用戶只需給定了一些數據,JUnit自動利用這些數據組合出各種各種可能的組合來執行測試。
1、內置實現
(1)@DataPoints註解靜態變數方式
(2)@DataPoints註解靜態方法方式
@DataPoint用於註解靜態變數(或靜態方法),表示這個變數是個數據點。當執行testDivide這個Theory測試時,JUnit會把所有的DataPoint數據兩兩組合,形成一組組的測試數據,並用這些數據分別執行測試。執行上面的測試會輸出以下結果:
(3)如果需要限定某個參數,可以使用@TestOn註解
2、自定義實現
JUnit默認只提供了一個int型的簡單 Parameter Supplier 實現,而Theory機制真正的價值在於,能參考@TestedOn的做法,相對簡單的完全自定義出可重用 Parameter Supplier,適應於各種複雜要求的限定範圍參數值測試場景,滿足開發者所需的高度動態自定義範圍取值自動化測試,同時保留與一般@Test相同的強大兼容性。
例:
(1)定義annotation註解介面Between
(2)定義委託處理類 BetweenSupplier
(3)調用方式
(4)運行結果
十四、Test fixtures
Test Fixture是指一個測試運行所需的固定環境,也是就是測試運行之前所需的穩定的、公共的可重複的運行環境,這個「環境」不僅可以是數據,也可以指對被測軟體的準備,例如實例化被測方法所依賴的類、載入資料庫等等。
- @Before – 在每個@Test方法之前運行
- @After – 在每個@Test方法之後運行
- @BeforeClass – 在所有的@Test方法之前運行一次
- @AfterClass – 在所有的@Test方之後運行一次
註:
1、如果創建一個子類繼承有fixture註解的父類,那麼子類中的@Before方法會在測試方法之前、父類的@Before執行之後執行。
2、如果@Before方法里拋出了異常,@Test方法會跳過,但是@After還是會執行
3、每個測試方法都會在單獨的測試類的實例裡面運行,@BeforeClass在測試實例創建之前執行
運行結果:
十五、Categories 用例分類
category 和 testSuite的比較:testSuite是類級分組(xx.class),category是用例級分組(@Test),category是testSuite的升級
category使用步驟:
1、創建好測試類,及測試類中的測試用例
2、創建介面:按用例的分組來創建
3、@Category註解:將用例用@Category註解分組
4、創建類來執行這些分組的類
十六、總結
如果你覺得此文對你有幫助,如果你對軟體測試、介面測試、自動化測試、面試經驗交流感興趣歡迎加入軟體測試技術群:695458161,群里發放的免費資料都是筆者十多年測試生涯的精華。還有同行大神一起交流技術哦。