1、 介紹:
單元測試是用來對一個模塊、一個函數或者一個類來進行正確性檢驗的測試工作。
2、Junit介紹
①Junit是一款Java語言的單元測試使用的框架,Eclipse是直接對junit進行了集成的,所以我們可以直接使用。
②Junit4是基於註解的;
JUnit 5全然使用當前的Java 8重寫了全部代碼。因此JUnit 5的運行條件是Java 8環境。
DBunit 是一種擴展於JUnit的數據庫驅動測試框架。
3、Junit下載與安裝:
① 直接官網下載jar,加入項目中build path;
② 使用Mavne:
③ 工具的IDE自身集成:
4、Junit的使用
①
② 在編寫測試類的時候,測試類的名稱最好使用待測試類的名稱+test;測試方法最好是test+待測試的方法名字.
③ 測試方法上加註解@test
④ 使用斷言Assert 判斷結果
⑤ 運行
5、Junit的斷言
①Assert類常用斷言方法:
Javadoc 中充滿了這8個方法的便捷形式。這些便捷形式使得傳遞在測試中需要的任何類型都很簡單。以assertEquals方法爲例,它就有20種形式!大多數形式都是便捷形式,最終還是調用了核心的assertEquals(String message,Object expected, Object actual)方法。其實我一直比較好奇的,爲什麼Assert類沒有assertNotEquals方法。
另外在junit4中,也加入了AssertArrayEquals方法和AssertThat方法,這2個方法一個用來比較數組,一個用來使用matcher做自定義校驗。
②特殊斷言AssertThat
JUnit4.4引入了Hamcrest框架,Hamcest提供了一套匹配符Matcher
—-注意事項:
- 必須導入JUnit4.4之後的版本以及hamcrest-core.jar和hamcrest-library.jar才能使用assertThat方法
- 要用junit中的assertThat來進行斷言,記住靜態導入:
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.*;
語法:
assertThat(T actual, Matcher matcher);
assertThat(String reason, T actual, Matcher matcher);
其中actual爲需要測試的變量,matcher爲使用Hamcrest的匹配符來表達變量actual期望值的聲明;
- Hamcrest匹配器的用法
Hamcrest是一個測試的框架,它提供了一套通用的匹配符Matcher,靈活使用這些匹配符定義的規則,程序員可以更加精確的表達自己的測試思想,指定所想設定的測試條件。
hamcrest常用的匹配器:
核心:
anything - 總是匹配,如果你不關心測試下的對象是什麼是有用的
describedAs - 添加一個定製的失敗表述裝飾器
is - 改進可讀性裝飾器 - 見下 “Sugar”
邏輯:
allOf - 如果所有匹配器都匹配才匹配,像Java裏的&&
anyOf - 如果任何匹配器匹配就匹配,像Java裏的||
not - 如果包裝的匹配器不匹配器時匹配,反之亦然
對象:
equalTo - 測試對象相等使用Object.equals方法
hasToString - 測試Object.toString方法
instanceOf, isCompatibleType - 測試類型
notNullValue, nullValue - 測試null
sameInstance - 測試對象實例
Beans:
hasProperty - 測試JavaBeans屬性
集合:
array - 測試一個數組元素test an array’s elements against an array of matchers
hasEntry, hasKey, hasValue - 測試一個Map包含一個實體,鍵或者值
hasItem, hasItems - 測試一個集合包含一個元素
hasItemInArray - 測試一個數組包含一個元素
數字:
closeTo - 測試浮點值接近給定的值
greaterThan, greaterThanOrEqualTo, lessThan, lessThanOrEqualTo - 測試次序
文本:
equalToIgnoringCase - 測試字符串相等忽略大小寫
equalToIgnoringWhiteSpace - 測試字符串忽略空白
containsString, endsWith, startsWith - 測試字符串匹配
- 自定義Hamcrest匹配器
6、Junit核心註解
①、基礎
/*
* @Test:將一個普通方法修飾爲一個測試方法
* @Test(exception=XXX.class)
* @Test(time=毫秒)
* @BeforeClass:它會在所有的測試方法前被執行,static修飾
* @AfterClass:它會在所有的測試方法後被執行,static修飾
* @Before:它會在每一個測試方法前被執行一次
* @After:它會在每一個測試方法後被執行一次
* @Ignore:省略
* @RunWith:修改運行器org。junit。runner。Runner
*
* */
其實@Test不僅可以修飾一個普通方法爲測試方法,還可以獲取異常或者控制測試方法的執行時間
② @Test的功能
A,獲取異常代碼展示
1,獲取異常,對異常的捕獲:@Test(expected=XXX.class)
2,沒有通過@Test(expected=ArithmeticException.class)註解時代碼以及結果:
B,控制測試代碼執行時間,代碼展示
測試方法控制@Test(timeout=毫秒),主要是針對代碼中有循環代碼的測試控制或者超時運行不符合預期的判定
1,我們使用對一個死循環進行測試:
1 package com.duo.util;
2
3 import static org.junit.Assert.*;
4
5 import org.junit.Test;
6
7 public class Anotation {
8
9 @Test(timeout=2000)
10 public void testWhile(){
11 while(true){
12 System.out.println("run forever...");
13 }
14 }
15 }
結果及時運行2秒後系統自動停止運行;
2,讓當前線程運行2000毫秒,測試代碼運行3000毫秒,符合預期結果
1 package com.duo.util;
2
3 import static org.junit.Assert.*;
4
5 import org.junit.Test;
6
7 public class Anotation {
8
9 @Test(timeout=3000)
10 public void testReadFile(){
11 try {
12 Thread.sleep(2000);
13 } catch (InterruptedException e) {
14 // TODO Auto-generated catch block
15 e.printStackTrace();
16 }
17 }
18 }
運行結果通過;
也可以通過調整測試時間比線程時間小,測試不符合預期的場景;