測試套件
如果測試類寫到很多,每次要進行測試,難道要重新點擊每一個測試類來運行?如果有200個測試類要測試呢?
為了解決這個問題,引入了測試套件(TestSuite)。
通過將多個測試放入套件中,一並執行多個測試。
實例:一次運行多個測試類
比如,有兩個測試類,叫CalculatorTest和CalculatorTest2。
在測試類所在的包中新建一個類,叫做TestAll,如下:
package com.mengdd.junit; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class TestAll extends TestCase { public static Test suite() { // 創建一個測試套件 TestSuite suite = new TestSuite(); // 增加測試類的class對象 suite.addTestSuite(CalculatorTest.class); suite.addTestSuite(CalculatorTest2.class); return suite; } }
運行時,右鍵這個類,Run As ->JUnit Test:
就相當於運行了CalculatorTest和CalculatorTest2。
實例:進行方法的重復測試
如果要對某個方法進行多次測試,可以使用RepeatedTest。
使用時注意,測試類需要一個帶參數(String)的構造函數,將String參數傳給基類TestCase,調用基類的帶參數的構造函數。
於是修改之前的代碼如下:
被測試類不變:

package com.mengdd.junit; public class Calculator { public int add(int a, int b) { return a + b; } public int subtract(int a, int b) { return a - b; } public int multiply(int a, int b) { return a * b; } public int divide(int a, int b) throws Exception { if(0 == b) { throw new Exception("除數不能為0"); } return a / b; } }
測試類:

package com.mengdd.junit; import junit.framework.Assert; import junit.framework.TestCase; public class CalculatorTest extends TestCase { private Calculator calculator = null; public CalculatorTest() { super(); } public CalculatorTest(String name) { super(name); } @Override public void setUp() throws Exception { System.out.println("set up"); // 生成成員變量的實例 calculator = new Calculator(); System.out.println(calculator); } @Override public void tearDown() throws Exception { System.out.println("tear down"); } public void testAdd() { int result = calculator.add(1, 2); // 判斷方法的返回結果 Assert.assertEquals(3, result);// 第一個參數是期望值,第二個參數是要驗證的值 } public void testSubtract() { int result = calculator.subtract(1, 2); // 判斷方法的返回結果 Assert.assertEquals(-1, result);// 第一個參數是期望值,第二個參數是要驗證的值 } public void testMultiply() { int result = calculator.multiply(2, 3); // 判斷方法的返回結果 Assert.assertEquals(6, result);// 第一個參數是期望值,第二個參數是要驗證的值 } public void testDivide() { int result = 0; try { result = calculator.divide(12, 3); } catch (Exception e) { e.printStackTrace(); // 如果拋出異常,證明測試失敗,沒有通過,沒通過的測試計數在Failures中 Assert.fail(); // 如果不加這一行,如果程序進入到catch,無法判斷其失敗 } // 判斷方法的返回結果 Assert.assertEquals(4, result);// 第一個參數是期望值,第二個參數是要驗證的值 } public void testDivideByZero() { Throwable tx = null; int result = 0; try { result = calculator.divide(12, 0); Assert.fail("沒有拋出異常,測試失敗");// 如果執行到這行代碼,則證明沒有拋出異常,說明我們的驗證失敗 } catch (Exception e) { e.printStackTrace(); tx = e; } Assert.assertEquals(Exception.class, tx.getClass());// 拋出的異常類型是否和期望一致 Assert.assertEquals("除數不能為0", tx.getMessage());// 拋出的異常信息是否和期望一致 //如果上面兩個都通過,則測試通過 } }
測試套件類:
package com.mengdd.junit; import junit.extensions.RepeatedTest; import junit.framework.Test; import junit.framework.TestCase; import junit.framework.TestSuite; public class TestAll extends TestCase { public static Test suite() { // 創建一個測試套件 TestSuite suite = new TestSuite(); // 增加測試類的class對象 suite.addTestSuite(CalculatorTest.class); suite.addTestSuite(CalculatorTest2.class); // 測試某個方法多次,注意測試類需要提供帶參數的構造方法 suite.addTest(new RepeatedTest(new CalculatorTest("testSubtract"), 20)); return suite; } }
運行結果:
參考資料
聖思園張龍老師視頻教程