在編寫代碼的時候經過System.out和alert來作測試,很是麻煩,並且不夠正規,對於即將步入工做的人來講,一個正規的寫代碼習慣和測試習慣是很是重要的,所以應當認真學學如何使用JUnit。 java
junit包有junit3和junit4兩個版本,通常都使用junit4這個版本,兼容性好且更靈活。數據庫
首先新建一個項目叫JUnit_Test,咱們編寫一個Calculator類,這是一個可以簡單實現加減乘除、平方、開方的計算器類,而後對這些功能進行單元測試。這個類並非很完美,咱們故意保留了一些Bug用於演示,這些Bug在註釋中都有說明。該類代碼以下:數組
package dyz.calculator; public class Calculator { private static int result; // 靜態變量,用於存儲運行結果 public void add(int n) { result = result + n; } public void substract(int n) { result = result - 1; // Bug: 正確的應該是 result =result-n } public void multiply(int n) { } // 此方法還沒有寫好 public void divide(int n) { result = result / n; } public void square(int n) { result = n * n; } public void squareRoot(int n) { for (;;) ; // Bug : 死循環 } public void clear() { // 將結果清零 result = 0; } public int getResult() { return result; } }
右鍵JUnit_Test項目,在build path中「add library」,添加JUnit,以下圖所示:eclipse
右鍵Calculator類,選擇「new",建立JUnit Test Caseide
測試用例代碼以下:函數
package dyz.calculatortest; import static org.junit.Assert.*; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import xw.calculator.Calculator; public class CalculatorTest { private static Calculator calculator = new Calculator(); // 復原操做,代表對每一個Test方法測試之後都會進行這個方法操做。 @Before public void setUp() throws Exception { calculator.clear();// 結果清零 } @Test public void testAdd() { // fail("Not yet implemented"); calculator.add(2); calculator.add(3); assertEquals(5, calculator.getResult()); } @Test public void testSubstract() { // fail("Not yet implemented"); calculator.add(10); calculator.substract(2); assertEquals(8, calculator.getResult()); } // 忽略標註,代表這個方法功能尚未實現 @Ignore("Multiply() Not yet implemented") @Test public void testMultiply() { fail("Not yet implemented"); } @Test public void testDivide() { // fail("Not yet implemented"); calculator.add(8); calculator.divide(2); assertEquals(4, calculator.getResult()); } // Timeout參數代表了你要設定的時間,單位爲毫秒,所以1000就表明1秒。 @Test(timeout = 1000) public void squareRoot() { calculator.squareRoot(4); assertEquals(2, calculator.getResult()); } /** * square1/square2/square3分別用來測試正數,0,複數的平方 */ @Test public void square1() { calculator.square(2); assertEquals(4, calculator.getResult()); } @Test public void square2() { calculator.square(0); assertEquals(0, calculator.getResult()); } @Test public void square3() { calculator.square(-3); assertEquals(9, calculator.getResult()); } }
經常使用註解說明 單元測試
一、@BeforeClass所修飾的方法在全部方法加載前執行,並且他是靜態的在類加載後就會執行該方法,測試
在內存中只有一份實例,適合用來加載配置文件。ui
二、@AfterClass所修飾的方法在全部方法執行完畢以後執行,一般用來進行資源清理,例如關閉數據庫鏈接。this
三、@Before和@After在每一個測試方法執行前都會執行一次。
四、@Test(excepted=XX.class) 在運行時忽略某個異常。
五、@Test(timeout=毫秒) 容許程序運行的時間。
六、@Ignore 所修飾的方法被測試器忽略。
七、@RunWith 能夠修改測試運行器 org.junit.runner.Runner
考慮一種場景,若是要單獨測試正數的平方,0的平方以及負數的平方,那麼就要建立三個測試方法來進行測試,這樣會顯得特別繁瑣,如步驟4中最後的三個測試方法square1()、square2()和square3()。JUnit考慮到了這種狀況,提出了參數化測試方法。這個時候運行器也不是默認的運行器,而是經過@RunWith(Parameterized.class)來標註。
參數化測試代碼以下所示;
package dyz.calculatortest; import static org.junit.Assert.*; 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 org.junit.runners.Parameterized.Parameters; import dyz.calculator.Calculator; @RunWith(Parameterized.class) public class SquareTest { private static Calculator calculator = new Calculator(); private int param; private int result; @Parameters public static Collection<Object[]> data() {//定義測試數據的集合 return Arrays.asList(new Object[][] { { 2, 4 }, { 0, 0 }, { -3, 9 }}); } // 構造函數,對變量進行初始化,參數的順序與數據集成的順序相關 public SquareTest(int param, int result) { this.param = param; this.result = result; } // 復原操做,代表對每一個Test方法測試之後都會進行這個方法操做。 @Before public void setUp() throws Exception { calculator.clear();// 結果清零 } @Test public void testSquare() { calculator.square(param); assertEquals(result, calculator.getResult()); } }
具體步驟:
一、更改默認的測試運行器爲@RunWith(Parameterized.class)。
二、聲明變量來存放預期值和測試值。
三、聲明一個返回值爲Collection的公共靜態方法,並用@Parameters修飾。
四、爲測試類聲明一個帶有參數的公共構造函數,並在其中爲他聲明變量賦值。
考慮另一種場景,若是一個項目中有許多個測試類,一個一個去運行會很是繁瑣,這個時候就能夠考慮使用打包測試。將全部須要運行的測試類集中起來,一次性的運行完畢,大大的方便了咱們的測試工做。
右鍵Calculator類,新建一個JUnit Test Suite,以下圖所示。
而後選擇須要打包測試的測試類,以下圖所示:
打包測試類叫作AllTests,須要打包測試的三個測試類是CalculatorTest,SquareTest和test。點擊Finish完成打包測試,生成的打包測試類代碼以下:
package dyz.calculatortest; import org.junit.runner.RunWith; import org.junit.runners.Suite; import org.junit.runners.Suite.SuiteClasses; @RunWith(Suite.class) @SuiteClasses({SquareTest.class,CalculatorTest.class,Test.class}) public class AllTests { }
運行結果以下:
注意事項:
一、做爲測試套件的入口類,類中不能包含任何方法。
二、更改測試運行器Suite.class。
三、將須要運行的測試類放入Suite.SuiteClasses({})的數組中。