在Eclipse中使用JUnit4進行單元測試
單元測試,JUnit4。
這兩個有什麼關係呢?這就好比(草)單元測試和(割草機)。用這個JUnit4工具去輔助我們進行測試。其實不理解這個也沒關係,聽多了見多了用多了,自然而然地就會懂了。
有人可能會想,那我直接自己編寫個測試的方法不就可以了。例如寫個System.out.print輸出,看看是否與我們預期的相等。Bingo!這樣也是可以的。但是你有割草機不用,那效果也是很Duang的。
開始我也覺得沒有必要使用割草機(JUnit)的,但是我瞭解了割草機(JUnit)之後,我很喜歡那種唰唰唰(綠條)的感覺。
如果你還是一臉疑惑不知道什麼是JUnit4,不知道單元測試,OK,Don‘t worry。Just Follow me.跟我一步一步來,先讓你體驗下唰唰唰的快感。
第一步:
開啟eclipse.exe,建立一個名為“Ives”的工專案,建立一個名為”UnitTest”的類。寫幾個方法:兩數+ - * /的方法和返回結果的方法。
程式碼如下:
1 import java.util.*; 2 public class Expression { 3 int a; 4 int b; 5 static int c;//使用者答案 6 int answer;//答案 7 static Scanner in=new Scanner(System.in); 8 9 10 public int Expression(){ 11 a = new Random().nextInt()%10; 12 b = new Random().nextInt()%10; 13 System.out.print(""+a+"+"+b+"="); 14 return answer = a + b; 15 16 } 17 public static void main(String[] args){ 18 int answer; 19 Expression expression = new Expression(); 20 answer = expression.Expression(); 21 try{ 22 Expression.c = in.nextInt(); 23 } 24 catch(InputMismatchException e) 25 { System.err.println("\nError ,please Enter a Int number"); 26 } 27 if(answer==c) 28 { 29 System.out.print("答對了"); 30 } 31 else System.out.print("答錯了"); 32 //System.out.print("answer="+answer); 33 } 34 }
第二步:
Duang!酷炫的效果來了,跟緊腳步了。
將JUnit4單元測試包引入這個專案:在該專案“Ives”上點右鍵,點“屬性”(Properties),如圖:
在彈出的屬性視窗中,首先在左邊選擇“Java 構建路徑”(Java Build Path),然後到右上選擇"庫(L)"(Libraries)標籤,之後在最右邊點選“新增庫(A)”(Add Libraries)按鈕,如下圖所示:
點選完成,JUnit4軟體包就被包含進我們這個專案了。
第三步:
生成JUnit測試框架:在Eclipse的包資源管理器(Package Explorer)中用右鍵點選該類”UnitTest“彈出選單,選擇 新建 →JUnit測試用例 (New à JUnit Test Case)。如下圖所示:
在彈出的對話方塊中,進行相應的選擇,如下圖所示:
點選完成之後會出現如下圖:
千萬不要去刪除@Test這個標誌很重要的!!!!!然後把fail(“尚未實現”)刪除,把自己的程式碼敲進去就可以了。我選擇了測試4個方法,所以它會自動生成4個測試方法。
Duang!!!
那測試方法怎麼寫呢?舉個例子,我想知道我的UnitTest裡面的plus方法有沒有寫對,那我就對這個方法寫個測試。把a,b兩個數傳遞進去,例如a=1和b=1,那a+b就等2,所以這裡我們又要了解新的東西了。那就是關於JUnit 的api了,下面有關於JUnit的api,到時候我看看要不要貼幾個常用的方法出來,加上例項,這樣會更加容易理解。
繼續我們的話題:我們知道a+b=2,所以如果plus方法的result是2的話,那就說明了我們的這個plus暫時沒有這型別的bug。所以我們要用到方法assertEquals(double expected, double actual)
這個方法裡的double expected是我們期望的值,double actual是實際的值。例如
assertEquals(2, a+b),這樣就可以測試方法有沒有算錯了。其實電腦一般都不會算錯吧?哈哈
完整的測試程式碼如下:
1 import static org.junit.Assert.*; 2 import org.junit.Test; 3 4 public class UnitTestTest { 5 public static UnitTest puls = new UnitTest(); 6 public static int answer; 7 @Test 8 public void testPlus() { 9 puls.plus(1,1); 10 assertEquals(2, puls.getresult()); 11 } 12 13 @Test 14 public void testMinus() { 15 puls.minus(1,1); 16 assertEquals(0, puls.getresult()); 17 } 18 19 @Test 20 public void testMultiply() { 21 puls.multiply(1,1); 22 assertEquals(1, puls.getresult()); 23 24 } 25 26 @Test(expected=ArithmeticException.class) 27 public void testDivide1(){ 28 puls.divide(0, 1); 29 } 30 31 @Test 32 public void testDivide() { 33 puls.divide(1,1); 34 assertEquals(1, puls.getresult()); 35 } 36 }
可能用心看的童鞋可能會發現我還寫了一個測試時關於有沒有丟擲異常的。如果除數為0那就丟擲異常,再去測試它除數為0是有沒有丟擲異常。有人可能會問,我不知道什麼異常啊,很簡單,看
我們寫完程式碼,那麼唰唰唰的快感馬上就要到來了。
我把minus方法裡的“減號”改成了“加號”:如下圖
然後在執行測試類UnitTestTest.如下圖:
被測試的程式碼有bug,也就是之前把-修改成了+,所以就會出故障。
所以當全部都是綠色的時候是不是很爽,有沒有感受到割草機(JUnit4)的唰唰唰的快感。
哈哈,教程到這裡就結束了。是不是還想要更多?那就持續關注我的部落格吧,可能會在更新一遍更加細節的。
個人體會:
1.測試類一定要看清楚有沒有寫對,有時候複製黏貼沒有修改就會出現錯誤,所以要看清楚呼叫的方法對了沒有。
2.這個好像真的有比自己寫一個測試類來測試更爽,因為有一條綠色的東西,感覺很好玩。
3.我覺得這些小程式不需要寫單元測試,而且看到好多人在網上吐槽說現在基本做開發的都不會去寫單元測試的,不過,寫多點沒事兒,所學點更好。所以我不想去追究以後有沒有用,現在能學想學那就去學,能寫想寫,那就去寫。所以有時候真的不需要問為什麼?有很多事情你現在做可能沒有收益,也可能以後也沒有收益,那為什麼要去做呢?
柯騰說,你信不信十年後,我連log是什麼都不知道,還可以活得好好的。 沈佳宜說,我知道。 柯景騰說,那你還那麼用功讀書。 沈佳宜說,人生本來很多事就是徒勞無功的啊!不是每一件事一定要有意義,經歷同樣很寶貴!
有感而發,就引用了這句話了。哈哈
---------這篇博文就到此結束了------------
--------如果以上有什麼錯誤或者不足之處,歡迎指出。--------
PS:長期招募小夥伴一起組成一個團隊學習軟體開發(java), 可以合作開發軟體,也可以討論交流,有志同道合的小夥伴可以發站內訊息。
附:
Junit API:http://www.udel.edu/CIS/software/dist/junit4.1/javadoc/