zoukankan      html  css  js  c++  java
  • 转:测试驱动开发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
  • 相关阅读:
    Lab EIGRP不等价负载均衡
    Lab EIGRP metric计算
    EIGRP Troubleshooting Summary
    EIGRP Query Range查询过程详细分析
    EIGRP Auto-Summary Affect The Query Range
    EIGRP Distribute-list Affect The Query Range
    Understanding EIGRP Queries
    EIGRP DUAL
    33、为什么析构函数一般写成虚函数
    32、C和C++的类型安全
  • 原文地址:https://www.cnblogs.com/youxin/p/3081239.html
Copyright © 2011-2022 走看看