JUnit —— TestSuite 的使用

weixin_34344677發表於2013-10-17

首先說一下,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

 

 

相關文章