首先說一下,suite ,中文是 一套,一組 的意思。
那麼,TestSuite,顧名思義,就是用來執行一組測試的。
如何使用呢 ?
假設有個這樣的測試類 StudentDAOTest ,程式碼如下:
1 package org.young.junit.testsuite; 2 3 import junit.framework.TestCase; 4 5 import org.young.junit.testsuite.dao.StudentDAO; 6 import org.young.junit.testsuite.dao.StudentDAOImpl; 7 import org.young.junit.testsuite.entity.Student; 8 9 public class StudentDAOTest extends TestCase { 10 11 private StudentDAO dao; 12 13 /** 14 * 建立 DAO 例項 15 */ 16 public void setUp() { 17 dao = new StudentDAOImpl(); 18 } 19 20 public void testAdd() { 21 Student stu = new Student(); 22 23 dao.add(stu); 24 } 25 26 public void testDelete() { 27 28 dao.delete("id"); 29 } 30 31 public void testUpdate() { 32 Student stu = new Student(); 33 34 dao.update(stu); 35 } 36 37 public void testLoadWithId() { 38 39 Student stu = dao.load("xyz"); 40 41 assertNotNull(stu); 42 } 43 44 public void testLoadWithNullOrEmptyStr() { 45 46 Student stu = dao.load(""); 47 assertNull(stu); 48 49 stu = dao.load(null); 50 assertNull(stu); 51 } 52 53 }
如果想一次執行幾個方法,而不是所有方法改怎麼辦呢?
TestSuite 該上場了。
為了方便比較,再來一個測試類 CourseDAOTest ,程式碼如下:
1 package org.young.junit.testsuite; 2 3 import org.junit.Before; 4 import org.junit.Test; 5 import org.young.junit.testsuite.dao.CourseDAO; 6 import org.young.junit.testsuite.dao.CourseDAOImpl; 7 import org.young.junit.testsuite.entity.Course; 8 9 import junit.framework.TestCase; 10 import junit.framework.TestSuite; 11 12 /** 13 * Suite 的實現方式一 14 * 15 * public static Test suite(){} 的方式 16 * 17 * @author by Young.ZHU 18 * on 2013-9-30 19 * 20 * Package&FileName: org.young.junit.testsuite.CourseDAOTest 21 */ 22 public class CourseDAOTest extends TestCase { 23 24 private CourseDAO dao; 25 26 public CourseDAOTest() { 27 super(); 28 } 29 30 public CourseDAOTest(String name) { 31 super(name); 32 } 33 34 @Override 35 protected void setUp() throws Exception { 36 super.setUp(); 37 38 dao = new CourseDAOImpl(); 39 } 40 41 /** 42 * 注意:繼承 TestCase 後,JUnit 4 裡的 @Before 、@Test 等註解就沒用了 43 * 44 * @Before 的功能可由方法 setUp() 實現 45 */ 46 @Before 47 public void init() { 48 System.out.println("fsdfsdf"); 49 dao = new CourseDAOImpl(); 50 } 51 52 /** 53 * 執行這個測試類的部分方法 54 * 55 * 方法頭必須是這樣的 public static junit.framework.Test suite() 56 * 即,靜態(static) 的 57 * 58 * @return 59 */ 60 public static junit.framework.Test suite() { 61 TestSuite suite = new TestSuite(); 62 63 /* 64 * 字串引數為想要執行的該測試類的方法 65 */ 66 suite.addTest(new CourseDAOTest("testLoad")); 67 suite.addTest(new CourseDAOTest("testAdd")); 68 69 return suite; 70 } 71 72 @Test 73 public void testAdd() { 74 Course course = new Course(); 75 76 dao.add(course); 77 } 78 79 @Test 80 public void testDelete() { 81 fail("Not yet implemented"); 82 } 83 84 @Test 85 public void testUpdate() { 86 fail("Not yet implemented"); 87 } 88 89 @Test 90 public void testLoad() { 91 Course course = dao.load("course_id"); 92 93 assertNotNull(course); 94 } 95 96 }
先執行一下,看下效果:
雖然這個測試類寫了增(add)、刪(delete)、改(update)、查(load),但實際執行的只有兩個方法 —— testLoad 和 testAdd 。
祕密就在於程式碼第 60 行的 suite() 方法,這個方法決定了該測試類執行哪些方法。
有兩點需要說明:
1、關於方法 suite() 的方法頭
正如註釋裡寫道的,這個方法的方法頭是固定的
1 public static junit.framework.Test suite() { 2 // your code ... 3 }
2、測試類的構造方法
測試類 CourseDAOTest 中第 30 行帶引數的建構函式,在 66 行和 67 行用到了。
建構函式的引數即要執行的測試方法的名稱。
最後,把兩個集合起來看,測試類 AllTest ,程式碼如下:
1 package org.young.junit.testsuite; 2 3 import junit.framework.TestSuite; 4 5 6 public class AllTest { 7 8 public static junit.framework.Test suite() { 9 TestSuite suite = new TestSuite("All Test"); 10 11 /* 12 * StudentDAOTest 類的全部測試方法 13 */ 14 suite.addTest(new TestSuite(StudentDAOTest.class)); 15 /* 16 * CourseDAOTest 類的部分方法 17 */ 18 suite.addTest(CourseDAOTest.suite()); 19 20 return suite; 21 } 22 23 }
執行後,效果如下:
詳細程式碼可參考:
https://github.com/YoungZHU/CollectionCode4Java/tree/master/test/org/young/junit/testsuite