转:测试驱动开发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下的所有测试类都会被执行。只不过是文本形式显示结果。
转自:http://dendrobium.iteye.com/blog/122611
原文地址:https://www.cnblogs.com/youxin/p/3081239.html