• JUnit —— TestSuite 的使用


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

  • 相关阅读:
    HDU1251 统计难题
    字典树模板
    HDU5536 Chip Factory(01字典树)
    函数的返回值
    函数的使用原则
    文件修改
    函数
    文件内指针移动
    文件操作模式
    字符编码
  • 原文地址:https://www.cnblogs.com/memory4young/p/junit-testsuite.html
Copyright © 2020-2023  润新知