眾所周知,在一個大型的軟件項目中,測試是必不可少的。傳統的測試方法往往要自己編寫測試函數再結合測試用例進行驗證,這樣會顯得比較繁瑣。所以我們可以使用JUnit框架進行測試。
使用junit的好處就是這個結果是否正確的判斷是它來完成的,我們只需要看看它告訴我們結果是否正確就可以了,在一般情況下會大大提高效率。
下圖為傳統測試方法與JUnit測試方法的代碼量對比。
接下來就是安裝JUnit了
前提條件:電腦已安裝eclipse,已配置java環境。
步驟一:下載JUnit與Hamcrest對應的jar包(注:Hamcrest是JUnit底層的匹配工具)
必須文件如圖所示:
接下來將這些文件導入對應項目中。(注:為了項目的可遷移性這里暫時不添加到全局變量。)
在Eclipse中新建項目 (File - new - javaproject)
建完項目之后右鍵點擊項目,選擇Build Path - Configure Build Path
然后點擊Libraries - Add External JARs,選擇你剛才下載的三個jar包,點擊打開。
導入完成如圖所示
查看左側項目中應該多出來這三個jar包,至此JUnit項目環境已配置完成。
步驟二:安裝測試覆蓋率工具 Eclemma
在Eclipse上方菜單欄中點擊Help,選擇Eclipse Marketplace,在搜索欄中輸入Eclemma,搜索出來后點擊Install安裝即可。
如果Eclipse上方導航欄出現這樣一個小標記說明安裝成功:
至此,環境配置已全部完成,下面來編輯一個小程序來測試一下Junit。
步驟三:程序測試
從最簡單的測試加法減法開始,便於新手理解。
在項目下src文件夾下新建一個包(package),這里我命名為cn.tjuscs.st,大家可以自行命名。
在項目下新建類(class),我命名為MyTest,大家可以自行命名。
下面為代碼:
package cn.tjuscs.st; public class MyTest { private int result; public void add(int a, int b) { result = a + b; } public void substract(int a, int b) { result = a - b; } public int getresult() { return result; } }
很簡單的加法與減法函數,相信大家都可以看得懂。
然后右鍵點擊MyTest.java,選擇new-JUnit Test Case,點擊next選擇函數add和substract后點擊finish。這里不選擇也可以,后續自行編輯。
然后eclipse會生成一個MyTestTest.java的類,表示這個是測試類。
下面是編輯后MyTestTest.java的代碼:
package cn.tjuscs.st; import static org.junit.Assert.*; import org.junit.Test; import org.junit.Ignore; public class MyTestTest { MyTest t=new MyTest(); @Test public void testAdd() { t.add(1,4); assertEquals(5, t.getresult()); } @Test public void testSubstract() { t.substract(9,4); assertEquals(5, t.getresult()); } }
代碼解釋:@Test告訴JUnit接下來進行測試,assertEquals(期望值,測試用例);是JUnit自帶的函數用來檢測是否與預期相符。
因為1+4=5,9-4=5,這里兩個測試都沒有出問題,所以運行結果應該是一片綠色。
運行方法:在這個文件下點擊右鍵-run as-junit test
運行結果:
現在修改一下程序,把程序中的9換成6,按ctrl+s保存完再運行一下。
這里就可以看到testSubstract這個函數出錯了,和預期不符。
再來試一下覆蓋率測試工具eclemma:
點擊剛才裝完eclemma生成的小圖標旁邊的小箭頭,選擇MyTestTest,這里可以看到結果如下:
紅色代表未執行,黃色代表條件沒有全部執行(通常適用於if語句等),綠色代表執行過了。
如果這幾次運行結果和圖中相符,那么說明之前的步驟都沒有問題了,接下來進行編寫一個簡單的三角形的測試程序。
很簡單的代碼,只是為了了解一下junit的使用方法,所以就不添加其他檢測與判斷,這里就不再贅述了。
TestTriangle.java:
package cn.tjuscs.st; public class TestTriangle { public int getkind(int a, int b, int c) { int kind = 0; if (a+b<=c || a+c<=b || b+c<=a || a<=0 || b<=0 || c<=0) kind = -1; //-1代表三角形不成立 else if (a==b && b==c) kind = 1; //1代表等邊三角形 else if ((a==b && a!=c) || (a==c && a!=b) || (b==c && b!=a)) kind = 2; //2代表等腰三角形 else if (a!=b && b!=c) kind = 3; //3代表普通三角形 return kind; } }
TestTriangleTest.java:
package cn.tjuscs.st; import static org.junit.Assert.*; import org.junit.Test; public class TestTriangleTest { TestTriangle t = new TestTriangle(); @Test public void test_not_a_triangle() { assertEquals(-1,t.getkind(1,2,3)); } @Test public void test_equilateral() { assertEquals(1,t.getkind(2,2,2)); } @Test public void test_isosceles() { assertEquals(2,t.getkind(2,2,3)); } @Test public void test_scalene() { assertEquals(3,t.getkind(2,3,4)); } }
運行結果:
這里四個函數全部運行正確,符合預期。
總結:作為軟件開發人員,在大型項目中測試往往是一項工作量相當大的事情。如何正確地利用工具提高效率是作為一個程序員所必須知道的。JUnit就是一個相當好的工具,雖然成不了巨人,但是我們應該站在巨人的肩膀上看的更遠。