https://www.cnblogs.com/memory4young/p/junit-testsuite.html
首先说一下,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 }

运行后,效果如下:

详细代码可参考: