在介紹junit以前,把一些知識點提早了解一下html
單元測試是一個對單一實體(類或方法)的測試。java
測試用例(Test Case)是爲某個特殊目標而編制的一組測試輸入、執行條件以及預期結果,以便測試某個程序路徑或覈實是否知足某個特定需求。web
測試套件:一般把一組相關的測試稱爲一個測試套件(test suite)。編程
經過測試套件,將服務於同一個測試目的或同一運行環境下的一系列測試用例有機的組合起來。測試套件是按照測試計劃所定義的各個階段的測試目標決定的,即先有測試計劃,後面纔有測試套件。api
迴歸測試是指修改了舊代碼後,從新進行測試以確認修改沒有引入新的錯誤或致使其餘代碼產生錯誤。數組
測試常識:服務器
一個正式的編寫好的單元測試用例的特色是:即在測試執行前就已知輸入和預期輸出。框架
每一項需求至少須要兩個單元測試用例:一個正檢驗,一個負檢驗。若是一個需求有子需求,每個子需求必須至少有正檢驗和負檢驗兩個測試用例。maven
1 是什麼?編程語言
JUnit 是一個 Java編程語言的單元測試框架。
2 使用方法(舉例說明)測試用例類+運行類!!!
2.1 maven集成 junit 4.12
2.2 建立被測試類==== MessageUtil
public class MessageUtil { private String message; public MessageUtil(String message){ this.message = message; } public String printMessage(){ System.out.println(message); return message; } }
2.3 建立測試用例類====TestJunit
做用:測試用例類 顧名思義就是測試用例代碼!!!
import static org.junit.Assert.assertEquals; import org.junit.Test; import util.MessageUtil; public class TestJunit { String message = "Hello World1"; MessageUtil messageUtil = new MessageUtil("hello"); @Test public void testPrintMessage() { assertEquals(message,messageUtil.printMessage()); } }
2.4 建立運行類 ====TestRunner
做用:運行類 主要用來執行測試用例類!!!
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(TestJunit.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
2.5 運行 在運行類文件頁面 右擊
2.6 運行結果 ===會提示錯誤的地方
看到上面例子,發現測試代碼用了一些註解,如今介紹junit中的註解
3 註解
3.1 註解所在類
3.2 註解以及做用
註解 | 做用 |
@Test | 這個註釋說明依附在 JUnit 的 public void 方法能夠做爲一個測試案例。 |
@Before | 有些測試在運行前須要創造幾個類似的對象。在 public void 方法加該註釋是由於該方法須要在 test 方法前運行。 |
@After | 若是你將外部資源在 Before 方法中分配,那麼你須要在測試運行後釋放他們。在 public void 方法加該註釋是由於該方法須要在 test 方法後運行。 |
@BeforeClass | 在 public void 方法加該註釋是由於該方法須要在類中全部方法前運行。 |
@AfterClass | 它將會使方法在全部測試結束後執行。這個能夠用來進行清理活動。 |
@Ignore | 這個註釋是用來忽略有關不須要執行的測試的。 |
@Rule | 略 |
3.3 示例代碼
import static org.junit.Assert.assertEquals; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import util.MessageUtil; public class TestJunit {
//必定要靜態 @BeforeClass public static void beforeClass() { System.out.println("正在執行beforeClass註解的方法"); } @Before public void before() { System.out.println("正在執行before註解的方法"); } @Test public void testPrintMessage() { System.out.println("正在執行test註解的方法"); }
@Test
public void testCase2() {
System.out.println("正在執行test註解的方法2");
}
@After public void after() { System.out.println("正在執行after註解的方法"); }
//必定要靜態
@AfterClass public static void afterClass() {
System.out.println("正在執行afterClass註解的方法");
}
@Ignore public void ignore() {
System.out.println("正在執行ignore註解的方法");
}
}
到此,你們對junit有一個大概瞭解,可是junit進行單元測試,能測試哪些方面呢?
4 JUnit 能測試哪些方面呢?
4.1 斷言
4.1.1 經常使用類以及方法
這個類裏面有不少同名方法,做用同樣,只是參數數據類型不同,本身根據須要選用就能夠了。每種功能選一個方法示範。都是靜態void方法!
方法 | 描述 |
assertArrayEquals(byte[] expecteds, byte[] actuals) |
比較兩個參數是否相等 |
assertFalse(boolean condition) 【相反的assertTrue】 |
斷定參數(參數條件)是錯的 |
assertNotNull(Object object) 【相反的assertNull】 |
斷定對象不爲空 |
assertNotSame(Object unexpected, Object actual) 【相反的assertSame】 |
檢查兩個相關對象是否指向同一個對象 |
assertThat(T actual, org.hamcrest.Matcher<T> matcher) |
判斷actual是否符合matcher |
fail() |
測試失敗 |
4.1.2 示例代碼
略
4.2 執行過程
看註解部分
4.3 執行測試
測試用例是使用 JUnitCore 類來執行的。JUnitCore 是運行測試的外觀類。它支持運行 JUnit 4 測試, JUnit 3.8.x 測試,或者他們的混合。
4.3.1 經常使用類
4.3.2 示例代碼
4.4 套件測試
測試套件意味着捆綁幾個單元測試用例而且一塊兒執行他們。在 JUnit 中,@RunWith 和 @Suite 註釋用來運行套件測試。
4.4.1 經常使用類
4.4.2 示例代碼
測試用例類一
import static org.junit.Assert.assertEquals; import org.junit.After; import org.junit.AfterClass; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Ignore; import org.junit.Test; import util.MessageUtil; public class TestJunit1 { String message = "Hello World1"; MessageUtil messageUtil = new MessageUtil("Hello World1"); @Test public void testPrintMessage() { assertEquals(message,messageUtil.printMessage()); } }
測試用例類二
import static org.junit.Assert.assertEquals; import org.junit.Test; import util.MessageUtil; public class TestJunit2 { String message = "Hello World2"; MessageUtil messageUtil = new MessageUtil("Hello World2"); @Test public void testPrintMessage() { assertEquals(message,messageUtil.printMessage()); } }
套件類:
import org.junit.runner.RunWith; import org.junit.runners.Suite; @RunWith(Suite.class) @Suite.SuiteClasses({ TestJunit1.class, TestJunit2.class }) public class JunitTestSuite { }
執行類:
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(JunitTestSuite.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
4.5 忽略測試
看@Ingore
4.6 時間測試
Junit 提供了一個暫停的方便選項。若是一個測試用例比起指定的毫秒數花費了更多的時間,那麼 Junit 將自動將它標記爲失敗。timeout 參數和 @Test 註釋一塊兒使用。
4.6.1 經常使用類==@test的一個屬性
4.6.2 示例代碼
4.7 異常測試
unit 用代碼處理提供了一個追蹤異常的選項。你能夠測試代碼是否它拋出了想要獲得的異常。expected 參數和 @Test 註釋一塊兒使用。如今讓咱們看看活動中的 @Test(expected)。
4.7.1 經常使用類 ==@test的一個屬性
4.7.2 示例代碼
4.8 參數化測試
Junit 4 引入了一個新的功能參數化測試。參數化測試容許開發人員使用不一樣的值反覆運行同一個測試。
4.8.1 經常使用類
4.8.2 示例代碼
被測試類
public class IFShuangShu { public Boolean validate(final Integer primeNumber) { for (int i = 2; i < (primeNumber / 2); i++) { if (primeNumber % i == 0) { return false; } } return true; } }
測試用例類
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Arrays; import java.util.Collection; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.junit.runners.Parameterized; import util.IFShuangShu; @RunWith(Parameterized.class) public class TestJunit { private Integer inputNumber; private Boolean expectedResult; private IFShuangShu ifs; @Before public void initialize() { System.out.println("初始化被測試類的實例!!!"); ifs = new IFShuangShu(); } public TestJunit(Integer inputNumber, Boolean expectedResult) { System.out.println("參數賦值!!!"); this.inputNumber = inputNumber; this.expectedResult = expectedResult; } @Parameterized.Parameters public static Collection primeNumbers() { System.out.println("定義參數組合!!!"); return Arrays.asList(new Object[][] { { 2, true }, { 6, false }, { 19, true }, { 22, false }, { 23, true } }); } @Test public void test() { System.out.println("斷言方法!!!"); assertEquals(expectedResult, ifs.validate(inputNumber)); } }
執行類
import org.junit.runner.JUnitCore; import org.junit.runner.Result; import org.junit.runner.notification.Failure; public class TestRunner { public static void main(String[] args) { Result result = JUnitCore.runClasses(TestJunit.class); for (Failure failure : result.getFailures()) { System.out.println(failure.toString()); } System.out.println(result.wasSuccessful()); } }
4.9 JUnit 框架 擴展
名稱 | 做用 |
Cactus |
Cactus 是一個簡單框架用來測試服務器端的 Java 代碼(Servlets, EJBs, Tag Libs, Filters)。Cactus 的設計意圖是用來減少爲服務器端代碼寫測試樣例的成本。它使用 JUnit 而且在此基礎上進行擴展。Cactus 實現了 in-container 的策略,意味着能夠在容器內部執行測試。 |
JWebUnit |
JWebUnit 提供了一種高級別的 Java API 用來處理結合了一系列驗證程序正確性的斷言的 web 應用程序。這包括經過連接,表單的填寫和提交,表格內容的驗證和其餘 web 應用程序典型的業務特徵。 |
XMLUnit |
針對XML的測試 |
MockObject |
在一個單元測試中,虛擬對象能夠模擬複雜的,真實的(非虛擬)對象的行爲,所以當一個真實對象不現實或不可能包含進一個單元測試的時候很是有用。 |