Junit是一種java單元測試的工具,讓我們的測試提高效率
入門篇
我們先來看一個測試加法add的例子
先建立一個AddOperation的類(我們要測試的類)
package work;
publicclass
AddOperation {
publicint add(int
x,int y){
return x+y;
}
}
給該類添加測試類
詳細請看圖
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZD9CX5RXa2Fmcn9CXwczLcVmds92czlGZvwVP9EUTDZ0aRJkSwk0LcxGbpZ2LcBDM08CXlpXazRnbvZ2LcRlMMVDT2EWNvwFdu9mZvwVPnpmTx0keZZXUYpVd1kmYr50MZV3YyI2cKJDT29GRjBjUIF2LcRHelR3LcJzLctmch1mclRXY39DNzczNyMTN1EDNwYDM0EDMy8CX0Vmbu4GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.jpg)
選擇你要測試的類
importstatic
org.junit.Assert.*;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
AddOperationTest {
@BeforeClass
publicstaticvoid
setUpBeforeClass()throws Exception {
@AfterClass
tearDownAfterClass()throws Exception {
@Test
publicvoid
testAdd() {
fail("Not yet implemented");
@是Fixture(暫且翻譯為“固定代碼段”)标注,用于表明和分類,根據@後面的名字能确定某個方法的作用,它的引入讓函數方法的名字可以随便寫,編譯器根據@來确定方法的用途
下面介紹一些常見的需要熟悉的标注
@Before:
使用了該中繼資料的方法在每個測試方法執行之前都要執行一次。
@After:
使用了該中繼資料的方法在每個測試方法執行之後要執行一次。
注意:@Before和@After标示的方法隻能各有一個。這個相當于取代了JUnit以前版本中的setUp和tearDown方法,當然你還可以繼續叫這個名字,不過JUnit不會霸道的要求你這麼做了
@BeforeClass和@AfterClass
在測試用例初始化時執行@BeforeClass方法,當所有測試執行完畢之後,執行@AfterClass進行收尾工作,新的版本一般用@BeforeClass和
@AfterClass代替@Before和@After,對于多個@Test的程式,每次Test之前都會執行@Before,如果要導入一個很大的測試檔案,絕大部分時間都花在了導入資料上,而@BeforeClass隻要導入資料一次就行,
。
@Test(expected=*.class)
在JUnit4.0之前,對錯誤的測試,我們隻能通過fail來産生一個錯誤,并在try塊裡面assertTrue(true)來測試。現在,通過@Test中繼資料中的expected屬性。expected屬性的值是一個異常的類型
@Test(timeout=xxx):
該中繼資料傳入了一個時間(毫秒)給測試方法,
如果測試方法在制定的時間之内沒有運作完,則測試也失敗。
@ignore:
該中繼資料标記的測試方法在測試中會被忽略。當測試的方法還沒有實作,或者測試的方法已經過時,或者在某種條件下才能測試該方法(比如需要一個資料庫聯接,而在本地測試的時候,資料庫并沒有連接配接),那麼使用該标簽來标示這個方法。同時,你可以為該标簽傳遞一個String的參數,來表明為什麼會忽略這個測試方法。比如:@lgnore(“該方法還沒有實作”),在執行的時候,僅會報告該方法沒有實作,而不會運作測試方法。
進階篇
上面的測試隻能進行單組測試,如何進行多組測試呢?
下面開始介紹,參考以下代碼,差不多算個模闆吧。
//頭檔案一大堆,想了解更透徹的可以自己上網查資料
import java.util.Arrays;
import java.util.Collection;
importorg.junit.After;
importorg.junit.AfterClass;
importorg.junit.Before;
import org.junit.runners.*;
import org.junit.runners.Parameterized.Parameters;
import org.junit.runner.*;
@RunWith(Parameterized.class)
//先建一個要測試的類
privatestatic
AddOperationtemp =new AddOperation();
//測試類要生成的資料
privateinta,b;
privateintresult;
@Parameters
publicstaticCollection
data(){//測試資料都放在這裡
//Object是一個二維對象,第一維表示可以多組測試
//還有一維,分别放了輸入資料,結果資料(輸入,輸出資料可能都有多個)
//這裡輸入資料有兩個,輸出資料有一個
return Arrays.asList(new Object[][]{
{1, 2, 3},
{2, 3, 4},
{3, 4, 5}
});
//構造函數,對變量進行初始化,這個函數會多次調用,
//每次調用自動讀取Collection
data内的一組資料
public
AddOperationTest(int a,
int b,int result){
this.a
= a;
this.b
= b;
this.result
= result;
}
@Test
publicvoid
test() {//測試,自動捕捉不正确的測試資料
assertEquals(result,temp.add(a,b));
點選運作
看運作結果,測試組數編号從0開始,第0組通過(綠色表示通過), 第1, 2組沒有通過(紅色表示沒通過)
如果全部通過,總的進度條會變綠,自己可以動手試一下。