测试驱动开发With JUnit(二)

第二章:JUnit测试套件:
       在第一节中简单的介绍了JUnit的使用,但是每次运行测试类时,该测试类的所有方法全部都被测试一遍,如果想单独测试某个方法还是比较麻烦的。但是可以利用测试套件来解决这个问题。
       下面我们先更改CalculateUtilTest向里面增加一个构造方法
 
import  junit.framework.TestCase;    public   class  CalculateUtilTest  extends  TestCase    {              public  CalculateUtilTest(String name)     //1行        {             super (name);        }          ……其余方法省略    }  

       代码解释:
       1行:自定义构造方法,里面有一个String参数,在该方法中调用父类的构造方
                 法。
       构造一个类来操作测试套件:
import  junit.framework.*;    public   class  MainTest    {         public   static  Test suite()   //1行        {            TestSuite suite =  new  TestSuite();   //2行                   //添加测试testDivision方法            suite.addTest( new  CalculateUtilTest( "testDivision" ));   //3行                   //添加测试testCreate方法            suite.addTest( new  CalculateUtilTest( "testCreate" ));             return  suite;        }              public   static   void  main(String[] args)        {             //执行测试            junit.textui.TestRunner.run(suite());    //4行        }    }   
       代码解释:
       1行:静态方法,返回Test类对象。该方法主要是构造TestSuite类对象,然后向
                其中加入你想要测试的方法。
       2行:构造TestSuite类对象
       3行:向TestSuite对象中添加一个要测试的方法。
                 new CalculateUtilTest("testDivision")表示测试CalculateUtilTest类的
                 testDivision方法。
       4行:运行该测试套件
       上面的方法可以非常方便地添加自己所需要的方法,如果是用该方法,就要在编写测试方法时将其加入测试套件中。如果你觉得很麻烦,那么就使用下列一行代码一次测试一个类吧。
public   static   void  main(String[] args)    {        junit.swingui.TestRunner.run(CalculateUtilTest. class );    }  

        或者在suite方法中添加所要测试的类也可以
public   static  Test suite()    {        TestSuite suite =  new  TestSuite();        suite.addTestSuite(CalculateUtil. class );         return  suite;    }  
       尽管上面的测试套件提供了你所需要的各种粒度测试方法(按照方法名,测试整个类),但是有个问题是,当我们面临一大堆测试代码时,很容易忘记将你的测试类加入到一个测试套件中去。一个好的解决方法是让java程序扫描你的classpath中的全部类,搜集所需要的测试类然后逐一执行。这样做的好处就是不会有测试被遗漏,但缺点是某些测试,你并不希望每次都运行它们。具体做法如下:先编写收集测试类的功能,并将全部测试类装入测试套件。代码如下
import  java.lang.reflect.Modifier;    import  java.util.*;    import  junit.runner.*;    import  junit.framework.*;    public   class  SuiteBuilder    {         //将所有的测试类都加入TestSuite中         public   Test suite()        {            TestSuite suite= new  TestSuite();                  List list=getTestClassNames();             for ( int  i= 0 ;i<list.size();i++)   <="" span="">         {                suite.addTestSuite(createClass(list.get(i).toString()));            }             return  suite;        }              //获取全部测试类的类名         public  List  <string> getTestClassNames()        {            TestCollector collector =  new  ClassPathTestCollector()            {                 public   boolean  isTestClass(String classFileName)                {                     if  (! super .isTestClass(classFileName))                          return   false ;                    String className = classNameFromFile(classFileName);                    Class clazz = createClass(className);                     return  TestCase. class .isAssignableFrom(clazz) && isConcrete(clazz);                }            };             return  Collections.list(collector.collectTests());        }         //判断该类是否是接口或抽象类         private   boolean  isConcrete(Class clazz)        {             if  (clazz.isInterface())                 return   false ;             int  modifiers = clazz.getModifiers();            return  !Modifier.isAbstract(modifiers);         }          //加载该类         private  Class createClass(String name)        {             try            {                 return  Class.forName(name);            }             catch  (ClassNotFoundException e)            {                 return   null ;            }         }         //判断该类是否是测试类:标准如下         //1:类文件以.class结束         //2:类名不能有$,防止内部类         //3:类名必须以Test单词结尾         protected   boolean  isTestClass(String classFileName)        {             return  classFileName.endsWith( ".class" ) && classFileName.indexOf('$') <  0  &&                                        classFileName.indexOf( "Test" ) >  0 ;        }    }   
       注:注释都比较详细,在这里就不多解释了。
       然后编写测试套件类:
package  com;    public   class  MainTest    {         public   static   void  main(String[] args)        {            junit.textui.TestRunner.run( new  SuiteBuilder().suite());        }    }  

       运行该测试套件,你会发现在你的classpath下的所有测试类都会被执行。只不过是文本形式显示结果。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值