`
leon0122
  • 浏览: 45463 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

测试驱动开发With JUnit(二)

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

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

        或者在suite方法中添加所要测试的类也可以
  1. public   static  Test suite()   
  2. {   
  3.     TestSuite suite =  new  TestSuite();   
  4.     suite.addTestSuite(CalculateUtil. class );   
  5.      return  suite;   
  6. }  
       尽管上面的测试套件提供了你所需要的各种粒度测试方法(按照方法名,测试整个类),但是有个问题是,当我们面临一大堆测试代码时,很容易忘记将你的测试类加入到一个测试套件中去。一个好的解决方法是让java程序扫描你的classpath中的全部类,搜集所需要的测试类然后逐一执行。这样做的好处就是不会有测试被遗漏,但缺点是某些测试,你并不希望每次都运行它们。具体做法如下:先编写收集测试类的功能,并将全部测试类装入测试套件。代码如下
  1. import  java.lang.reflect.Modifier;   
  2. import  java.util.*;   
  3. import  junit.runner.*;   
  4. import  junit.framework.*;   
  5. public   class  SuiteBuilder   
  6. {   
  7.      //将所有的测试类都加入TestSuite中   
  8.      public   Test suite()   
  9.     {   
  10.         TestSuite suite= new  TestSuite();   
  11.      
  12.         List list=getTestClassNames();   
  13.          for ( int  i= 0 ;i<list.size();i++)   <="" span="">
  14.         {   
  15.             suite.addTestSuite(createClass(list.get(i).toString()));   
  16.         }   
  17.          return  suite;   
  18.     }   
  19.     
  20.      //获取全部测试类的类名   
  21.      public  List  <string> getTestClassNames()   
  22.     {   
  23.         TestCollector collector =  new  ClassPathTestCollector()   
  24.         {   
  25.              public   boolean  isTestClass(String classFileName)   
  26.             {   
  27.                  if  (! super .isTestClass(classFileName))   
  28.                       return   false ;   
  29.                 String className = classNameFromFile(classFileName);   
  30.                 Class clazz = createClass(className);   
  31.                  return  TestCase. class .isAssignableFrom(clazz) && isConcrete(clazz);   
  32.             }   
  33.         };   
  34.          return  Collections.list(collector.collectTests());   
  35.     }   
  36.      //判断该类是否是接口或抽象类   
  37.      private   boolean  isConcrete(Class clazz)   
  38.     {   
  39.          if  (clazz.isInterface())   
  40.              return   false ;   
  41.          int  modifiers = clazz.getModifiers();   
  42.         return  !Modifier.isAbstract(modifiers);   
  43.      }   
  44.       //加载该类   
  45.      private  Class createClass(String name)   
  46.     {   
  47.          try   
  48.         {   
  49.              return  Class.forName(name);   
  50.         }   
  51.          catch  (ClassNotFoundException e)   
  52.         {   
  53.              return   null ;   
  54.         }   
  55.      }   
  56.      //判断该类是否是测试类:标准如下   
  57.      //1:类文件以.class结束   
  58.      //2:类名不能有$,防止内部类   
  59.      //3:类名必须以Test单词结尾   
  60.      protected   boolean  isTestClass(String classFileName)   
  61.     {   
  62.          return  classFileName.endsWith( ".class" ) && classFileName.indexOf('$') <  0  &&     
  63.                                   classFileName.indexOf( "Test" ) >  0 ;   
  64.     }   
  65. }   
       注:注释都比较详细,在这里就不多解释了。
       然后编写测试套件类:
  1. package  com;   
  2. public   class  MainTest   
  3. {   
  4.      public   static   void  main(String[] args)   
  5.     {   
  6.         junit.textui.TestRunner.run( new  SuiteBuilder().suite());   
  7.     }   
  8. }  

       运行该测试套件,你会发现在你的classpath下的所有测试类都会被执行。只不过是文本形式显示结果。
分享到:
评论

相关推荐

    测试驱动开发with Junit(三)

    在“测试驱动开发with Junit(三)”这一主题中,我们将会深入探讨如何利用Java中的JUnit框架进行TDD实践。 JUnit是Java编程语言中最常用的单元测试框架之一,它为开发者提供了方便快捷的方式来编写和运行可重复的...

    测试驱动开发With Junit

    总结,测试驱动开发With Junit涉及到的主要知识点包括: - TDD(测试驱动开发)的概念和流程 - JUnit作为Java的单元测试框架,如何创建测试类和测试方法 - 如何使用`assert`方法进行断言,确保代码行为正确 - 创建和...

    JUnit 4测试驱动开发----junit技术讲解

    本文将深入讲解JUnit 4的关键特性和如何进行测试驱动开发。 1. 预备知识 在开始使用JUnit 4进行测试之前,了解一些预备知识是必要的。例如,Java 5引入的可变长参数(Variable-Length Arguments)允许函数接收不定...

    Pragmatic Unit Testing in Java with JUnit源码

    《Pragmatic Unit Testing in Java with JUnit》是一本专注于Java单元测试实践的书籍,其配套源代码提供了丰富的示例和实践案例,帮助读者深入理解如何有效地使用JUnit进行单元测试。JUnit是Java领域最广泛使用的...

    Junit 单元测试完整案例

    2. `@RunWith(SpringRunner.class)`:这是一个JUnit runner,它使得Spring TestContext Framework可以驱动测试执行。 3. `@SpringBootTest`:这个注解用于启动一个Spring应用上下文,可以指定配置类、web环境等。 ...

    junit4测试源码

    这个"junit4测试源码"可能包含了JUnit4框架的源代码,使得用户能够深入理解其内部工作原理,便于自定义扩展或学习测试驱动开发(TDD)的最佳实践。 首先,JUnit4引入了注解(Annotation)的概念,使得测试类和测试...

    Junit实战第二版

    《Junit实战第二版》是一本专注于Java编程领域中单元测试技术的专业指南,它详尽地阐述了如何利用Junit框架进行高效的测试驱动开发。这本书是面向Java开发者,特别是那些致力于提升代码质量、确保软件稳定性的程序员...

    软件测试与junit实践Java测试

    10. **TDD(测试驱动开发)**:JUnit也支持采用TDD(Test-Driven Development)模式,即先写测试,再编写能通过测试的代码,这有助于提高代码质量和可维护性。 总之,JUnit作为Java的主流测试工具,其强大功能和...

    软件测试与Junit实践 pdg

    在实际项目中,应当结合TDD(测试驱动开发)理念,先编写测试再实现功能,确保代码质量从一开始就得到保障。 总之,软件测试是保障软件质量的重要手段,而Junit作为Java的主流单元测试框架,为开发者提供了强大的...

    pragmatic unit testing in java with junit

    《Pragmatic Unit Testing in Java with JUnit》是一本专注于Java单元测试的指南,它深入讲解了如何有效地利用JUnit框架进行测试驱动开发(TDD)。JUnit是Java领域中最广泛使用的单元测试框架,它为开发者提供了编写...

    Pragmatic Unit Testing In Java With Junit

    - **Al Koscielny**(软件开发者):“如果在我开始进行测试驱动开发时就有这本书就好了。” - **Andrew Thompson**(顾问,Greenbrier & Russel):“虽然我对测试并不陌生,但我仍然在很多方面感到困惑。我认为这...

    junit4 单元测试源码

    【标题】"junit4 单元测试源码"涉及的是Java编程中单元测试的重要工具...通过分析和运行这些源码,学习者可以掌握单元测试的基本概念,了解如何编写有效的测试用例,以及如何利用Eclipse的集成环境进行测试驱动开发。

    Junit单元测试指南

    Junit单元测试是Java开发中的一个关键组成部分,它允许开发者对代码进行小规模的验证,确保每个函数或方法按照预期工作。本指南将深入探讨Junit的使用,帮助你掌握如何编写、运行和理解单元测试。 一、Junit简介 ...

Global site tag (gtag.js) - Google Analytics