`

[YUAN] JUNIT 源码分析总结

    博客分类:
  • Test
 
阅读更多

 今天看了下Junit3的源码,记录下一些心得。

 

 Junit的设计使用了许多设计模式。相关的文章网上也有很多。在TestResult中使用了Collecting Parameters 模式。这个模式的意义在于,该类的有几个成员变量集合,是负责记录测试的Failures和Erros,当然还有总共的Test的数目。

 

TestResult的run TestCase方法会调用具体的TestCase的run方法,如果失败(Failure 或 Error),将通过TestCase生成具体的是败类(TestFailure 或 TestError),最后在TestResult中,集合成员变量把相应的错误再收集起来。

 

这个模式可能比较简单,所以并没有在大话设计模式中看到过。

 

 

Junit3的基本结构可以用下图来表示(网上搜的):

 

 

这个图有些地方也没有画清楚,Test是个Interface,TestCase 继承了Assert并实现了Test, TestCase同时还引用了TestResult,TestCase的run方法,使用TestResult作为参数,其实调用了TestResult的run方法。 TestResult的run方法通过Test接口又回调了TestCase的runBare方法(包括setUp() 和 tearDown()的运行方法)。

 

再说说TestSuite。TestSuite也实现了Test接口,TestCase可以包括多个Test方法,而TestSuite可以包括多个TestCase,所以TestSuit也可以包含多个Test方法(此处说的Test方法是TestCase里的具体test的方法,不是Test类)。

 

所以TestSuite的使用方法有三种:

       1)指定具体的TestCase对象。

       2)指定具体的TestCase类(所有public的 void,无参数的 test开头的函数会被执行)

       3)指定一个类组,包含多个TestCase类。

 

// 1) TestSuite suite= new TestSuite(); suite.addTest(new MathTest("testAdd")); suite.addTest(new MathTest("testDivideByZero")); // 2) TestSuite suite= new TestSuite(MathTest.class); // 3) Class[] testClasses = { MathTest.class, AnotherTest.class } TestSuite suite= new TestSuite(testClasses);

 

 

 

test方法的特点:

 

     在TestSuite中又个isTestMethod()方法,说明了test方法的特点:

     1)参数为零个

     2)以test开头

     3)void返回

 

   正是这个特点也使Junit跟testNG比,还需要改进些。

 

 

 

 

设计模式总结:

 

    1.命令模式。

      

       Client发出请求,通过Command接口,具体的实现有Executor1,Executor2....ExecutorN,从而实现了Client到ExecutorN的解耦。

       在Junit中,Test是个顶层的接口,TestCase是这个接口的抽象实现。具体的实现由Client决定,你可以写自己的testcase,extends这个TestCase,然后又自己的测试方法,test开头(这是适配器模式)。

       在Junit中Client是Junit框架,例如它通过TestSuite来执行一系列的TestCase时,只要Client实现了TestCase接口,那么Junit框架就能够通过命令模式来调用具体的TestCase了。测试人员也不必关系Junit框架里面是怎么调用的。

 

 

     2. 适配器模式。

 

        上面也提到了适配器模式。TestCase是Test的抽象实现类。如果Client实现的TestCase只能执行TestCase中的test方法,那么会产生大量的客户实现类。

 

        一般情况,当Client希望通过发送Request1,Request2,Request3,... RequestN来调用服务器的同一个方法,那么此时服务器端就需要一个Adapter来讲这些RequestN指向同一个具体的实现Adaptee。

 

         在Junit中,框架的执行方法是run(),但是Client具体实现的TestCase可以是以test开头的public,void的方法,方法名随便定义。

 

 

     3. 组合模式。

        

         TestSuite可以灵活的组合不同的TestCase,包括三种方式。

 

     4. 模板方法模式。

       

         测试的流程具有可复制性。

 

     5. 观察者模式。

        JUnit提供了三种方式如Text,AWT,Swing这三种运行方式,并且JUnit需要提供方便的扩展接口,这样就存在对象间的依赖关系,当测试进行时的状态发生时(TestCase的执行有错误或者失败等),所有依赖这些状态的对象必须自动更新

 

       拿Text运行方式来说。在Junit的textUI包下,有两个类。ResultPrinter和TestRunner类,TestRunner的dorun方法,将resultPrinter加到TestResult的Listener列表中。 当TestCase运行时,会调用TestResult的run方法,TestResult方法的run 又调用不同的Listener的startTest方法,结束时调用endTest方法,出错时,addFailure和addError。就这样实现了观察者动态变化的模型。

 

     6. 收集参数模式。

         在TestResult中的run方法,参数是TestCase本身。定义了一个用来抛异常的Protectable对象,这个对象抛不同的exceptoin时,调用不同的add方法,添加Error列表和Failure列表。

     

 

    7. 装饰模式

         在Junit中可以对Test进行扩展,使测试人员能增加自己需要的特殊测试,如重复性测试RepeatTest,在多线程中测试ActiveTestSuite。

         装饰模式又名包装(Wrapper)模式。其意图是动态地给一个对象添加一些额外的职责”。 装饰模式有几个对象。装饰者,装饰的组件(component),具体的组件,装饰者的具体实现。

      具体的组件实现了Componet,装饰者拥有组件的引用,用引用来实现这个组件的作用。当需要装饰不同的具体实现时,可以继承装饰者来实现自己的装饰。

      在Junit中,Test就是那个Component,它有个具体的组件TestCase,一般的装饰者都是使用TestCase来实现测试。当你需要有自己的特殊需要时,你可能需哟啊一个TestDecorator(Junit帮你实现了)。TestDecorator中,它引用了Test这个组件。例如当你需要重复的测试,你可以写一个RepeatTest来继承TestDecorator,然后传入一个特殊的计数的变量,然后就可是实现自己的功能了。RepeatTest已经被Junit实现了。

 

        

          

       


 

  • 大小: 18.7 KB
分享到:
评论

相关推荐

    SPBT 源码学习笔记 - spbt-0707-test-java-web

    4. **源码分析**:阅读和理解源码是提升编程技能的有效方式。通过SPBT的源码,可以学习到设计模式、异常处理、并发控制等高级Java概念,同时也能理解其与Java Web的交互方式。 5. **软件插件**:在Java开发中,...

    完整的SSH框架开发的系统源码包含数据库设计等

    SSH框架是Web应用开发中常见的技术栈...以上内容详述了SSH框架开发的系统源码所涵盖的知识点,包括各个框架的职责、数据库设计的重要性以及Web应用开发的全过程。掌握这些知识,对于成为一名熟练的Web开发者至关重要。

    java毕业设计之2021030810源码.zip

    7. **源码分析**:"yuanma"可能是项目的源代码文件夹,包含业务逻辑处理、数据访问层、控制层等组件。通过阅读源码,可以深入理解项目的实现机制,学习如何组织和架构Java Web应用。 8. **版本控制与协作**:虽然未...

    基于java的-120-jspm面向学生成绩分析系统--LW-源码.zip

    该压缩包文件“基于java的-120-jspm面向学生成绩分析系统--LW-源码.zip”提供了一个基于Java技术构建的学生成绩分析系统的源代码。这个系统可能用于帮助教育机构或教师对学生的成绩进行统计、分析和管理,以便更好地...

    ant 1.8.1源代码

    5. **JUnit集成**: 对JUnit测试的支持得到了增强,包括测试结果的汇总和报告,方便进行持续集成和测试驱动开发。 **源代码分析** 深入研究Ant 1.8.1的源代码,我们可以了解其内部的工作机制: 1. **任务实现**: ...

    基于java的-149-springboot“漫画之家”系统--LW-源码.zip

    4. **源码分析**: - "??java?-149-springboot"????"??--LW-??\": 这可能是项目主目录,包含了项目的源代码结构。 - "????-yuan.png": 可能是系统架构或设计图,用于展示系统组件和它们之间的关系。 - "????"??....

    java毕业设计之学生平时成绩管理系统设计源码.zip

    - **yuanma**:这部分很可能是项目的源码文件,包含系统的业务逻辑、数据访问层、控制层等核心组件,通过阅读和分析源码,可以深入理解系统的设计思想和实现方式。 5. **程序设计**:在系统设计上,项目可能采用了...

    java毕业设计之旧车交易撮合算法设计源码.zip

    至于"yuanma",这可能是源码的压缩文件,包含了项目的实际代码,通过阅读和分析这些源码,可以深入学习项目的设计思想和实现方式。 在二手车交易撮合算法设计中,可能涉及的知识点包括: 1. 数据结构与算法:为了...

    基于java的-76-261汉服文化平台网站-源码.zip

    10. **测试**:为了保证软件质量,开发者可能使用JUnit进行单元测试,Mockito进行模拟对象测试,以及Selenium进行自动化UI测试。 11. **文档**:尽管压缩包中没有明确提到,但一个完整的项目通常会有相应的开发文档...

    基于java的-123-jspm烯烃厂压力管道管理平台--LW-源码.zip

    【标题】"基于java的-123-jspm烯烃厂压力管道管理...这个源码项目为Java开发者提供了一个学习和实践的平台,他们可以通过阅读和分析源代码,提升在企业级应用开发中的技能,同时了解如何处理工业自动化领域的特殊需求。

    java毕业设计之基于SSM框架的华建汽车出租系统设计与实现源码.zip

    4. **yuanma**:这个文件名可能是源码的简写,意味着包含了项目的所有源代码文件,包括但不限于业务逻辑层(Service)、持久层(DAO)、模型(Entity)、控制器(Controller)、视图(View)以及配置文件等。...

    基于java的-2-[计算机毕业设计]基于SSM的宠物管理系统-源码.zip

    【标题】中的“基于java的-2-[计算机毕业设计]基于SSM的宠物管理系统-源码.zip”表明这...通过这个项目,学生可以学习到完整的Web应用开发流程,从需求分析、设计、编码、测试到部署,同时加深对SSM框架的理解和使用。

    基于java的-21-[计算机毕业设计]基于SSM的游戏论坛平台-源码.zip

    【标题】:“基于Java的-21-[计算机毕业设计]基于SSM的游戏论坛平台-源码.zip” ...通过分析和学习这个项目,你将能够掌握SSM框架的实际应用,以及如何构建一个完整的Web应用程序,同时提升你的软件工程实践能力。

    PaaTP:计算薄纸碎片的工作

    【标题】:“PaaTP:计算薄纸碎片的工作” 在IT行业中,"PaaTP"可能是...由于没有具体的“PaaTP-master”项目源码或详细文档,以上分析基于一般的IT实践和经验进行。要深入了解该项目,需要查看实际的代码和相关文档。

    电影发现服务器

    "movie-discovery-server-master"这个文件名暗示这是一个项目的源码仓库,很可能包含了整个电影发现服务器的全部代码。 首先,我们要理解Java在构建Web服务中的作用。Java是一种广泛用于开发后端服务的语言,具有跨...

Global site tag (gtag.js) - Google Analytics