Junit 内部解密之一: Test + TestCase + TestSuite
转自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhq.html
nterface: Test 整个测试的的基础接口
Method 1: abstract int countTestCases() 这个方法主要是用来计算要运行的test case的数量的。
Method 2:abstract void run(TestResult result) 这个方法主要是用来执行一个测试用例并且在测试结果的实例中收集它的测试结果。
Class:TestCase
定义:abstract class TestCase extends Assert implements Test 继承了Assert类并且实现了Test接口。而且是个抽象类。
Class: TestSuite
定义:class TestSuite implements Test; Test接口的实现类,和TestCase一样. 但是TestSuite是一系列testcase的集合,将所有要运行的testcase add到TestSuite。
观察一:TestCase 和 TestSuite类都实现了Test 接口。
好处一:由于当你给TestSuite增加一个对象时,实际上增加的是Test,而不只是个TestCase,这样我们就既可以在TestSuite里面增加另一个TestSuite,也可以加入一个TestCase。如果是TestCase,那么就会运行那个单独的测试;如果是TestSuite,那么就运行一组测试。
如何实现:那么是如何实现上面说的那个好处呢?看下TestSuite的一个addtest方法就明白了:
Public void addTest(Test test) 新增一个test到testsuite,直接使用fTests.add(test)来新增。
这里可以新增的入参是Test接口,而不是一个TestCase对象,所以只要实现了Test接口的实现类,包括TestCase和TestSuite,都可以不断的增加下去。这样就引出了好处二和设计模式。
好处二:当我们为自己的应用程序创建特殊的suite或组合出TestAll类非常容易。简单说明下TestAll类:仅仅包含了一个静态的suite方法,会注册需要定期执行的所有的Test对象(包括TestCase对象和TestSuite对象)。
Java设计模式:Composite模式
定义:把对象组合(composite)成树状结构来表示部分-整体层次关系,Composite模式可以让客户一致的对待单个对象和对象的组合。
我们来看下Junit的Test接口和TestCase和TestSuite类是如何实现Composite模式的:
先搞清楚Junit里面的部分-整体分别是什么,这里单个的TestCase可以看作是部分,把复合的TestCase(TestSuite)看作是整体,看下面的图:
我们可以看到这样的模式会带来另外一些好处:
简化了JUnit的代码 JUnit可以统一处理组合结构TestSuite和单个对象TestCase。使JUnit开发变得简单容易,因为不需要区分部分和整体的区别,不需要写一些充斥着if else的选择语句。
好处三:TestCase是个抽象实现类,而且继承了Assert类,这里为啥要继承Assert类呢?因为在一个testcase中是肯定需要用的Assert断言的,如果不继承Assert类,那么testcase方法中要写成Assert.assert(),不是很简洁,现在继承了Assert类后,我们就可以在继承了TestCase类的测试类中直接assert(),使测试代码看得非常简洁和清楚。
定义了TestCase对象和TestSuite的类层次结构 基本对象TestCase可以被组合成更复杂的组合对象TestSuite,而这些组合对象又可以被组合,如我们上个例子,这样不断地递归下去。客户代码中,任何使用基本对象的地方都方便的使用组合对象,大大简化系统维护和开发。
仔细看看Test接口的方法,它存在一个是countTestCases方法,它来统计这次测试有多少个TestCase,另外一个方法run。还有一个参数TestResult,它来统计测试结果。这里为啥存在一个run方法呢? 我们想想Junit在run testcase的时候,需要把这些testcase的组成打包后成为请求发送到Junit Framework,这样我们实现TestCase类的时候,可以自由的实现run方法去打包发送请求。这样我们在写测试用例时候,只需继承TestCase,来完成run方法即可,把测试结果记录到TestResult中,这样的做法就好引出另外的Java设计模式。
Java设计模式:Command模式
定义:将一个请求封装成一个对象,从而使你可用不同的请求对客户进行参数化;对请求进行排队或记录请求日志...,Command告诉我们可以为一个操作生成一个对象并给出它的一个execute(执行)方法。
run()就是我们的Command模式的Excecute方法:
我们可以看到这样的模式会带来另外一些好处:
Command模式将实现请求的一方(TestCase开发)和调用一方(JUnit Fromwork)分离开。
Command模式可以将多个TestCase进行组合成一个复合命令,实际你将看到TestSuit就是它的复合命令。
Junit 内部解密之一: Test + TestCase + TestSuite的更多相关文章
- Junit内部解密之三: 单元测试用例运行的全过程
转自:http://blog.sina.com.cn/s/blog_6cf812be0100x8sb.html 我们以一个非常简单的TestCalculator类为例,只有一个测试方法: Public ...
- Junit 内部解密之二: TestResult + TestListener + Assert
转自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhw.html 之前我们看到了Test接口里面的run方法有个TestResult的参数,不错,这个类就 ...
- Junit内部解密之四: Junit单元测试最佳实践
我们做使用Junit工具来做单页测试或接口测试时,需要注意一些问题,包括我们的编码规范,test规范,以及编写测试代码的策略,以下个人的总结. 1.为还没有实现的测试代码抛出一个异常.这就避免了该测试 ...
- Junit核心——测试类(TestCase)、测试集(TestSuite)、测试运行器(TestRunner)
首先,把这三个定义简单的说明一下: 1.测试类(TestCase):一个包含一个或是多个测试的类,在Junit中就是指的是包含那些带有@Test注解的方法的类,同一样也被称作“测试用例”; 2.测试集 ...
- Disable testSuite and testCase on some environment
def testEnv = context.expand('${#Project#testEnv}') String[] testCases = ["CheckEARouting(ADS)A ...
- 移除project,testsuite,testcase级别所有的custom properties
// Remove all custom properties on Project level. If removed, custom properties cannnot be injected ...
- Groovy解析xml并且注入Project,TestSuite,TestCase级别的custom properties
import com.eviware.soapui.support.GroovyUtils import groovy.util.XmlParser def groovyUtils = new Gro ...
- junit设计模式--命令者模式
命令模式的意图 将一个请求封装成一个对象,从而使你可以用不同的请求对客户进行参数化: 对请求排队或记录请求日志,以及支持可撤销的操作: 命令模式告诉我们可以为一个操作生成一个对象并给出它的一个执行方法 ...
- junit源码解析--初始化阶段
OK,我们接着上篇整理.上篇博客中已经列出的junit的几个核心的类,这里我们开始整理junit完整的生命周期. JUnit 的完整生命周期分为 3 个阶段:初始化阶段.运行阶段和结果捕捉阶段. 这篇 ...
随机推荐
- 分金币 Uva 11300
题意 给定N个人成环状坐,每个人初始分配Ai的金币,金币总数可以被N整除,每个人可以给左右相邻的人一定数量的金币使得最终每个人的金币数量相同,求转移数量最小的方案所转移的总金币数量. N<=10 ...
- python 时间 相关
http://www.jb51.net/article/47957.htm 不管何时何地,只要我们编程时遇到了跟时间有关的问题,都要想到 datetime 和 time 标准库模块,今天我们就用它内部 ...
- Qt自己定义事件实现及子线程向主线程传送事件消息
近期在又一次学习Qt的时候,由于要涉及到子线程与主线程传递消息,所以便琢磨了一下.顺便把有用的记录下来,方便自己以后查询及各位同仁的參考! 特此声明,本篇博文主要讲述有用的,也就是直接说明怎么实现,就 ...
- util.string.js
ylbtech-JavaScript-util: util.string.js 字符串处理工具 1.A,JS-效果图返回顶部 1.B,JS-Source Code(源代码)返回顶部 1.B.1, ...
- Shell--命令别名与历史命令
1.命令别名设置:alias,unalias alias:列出目前系统所有的命令别名 设置命令别名:alias 别名=’命令 参数’ 例如:alias lm=’ls -l | more’ unalia ...
- 项目笔记:导出Excel功能分sheet页插入数据
导出Excel功能分sheet页处理数据: /*导出EXCEL*/ public void createExcel() { log.info("导出Excel功能已经启动-BEGIN&quo ...
- README.md文档
大标题 =================================== 大标题一般显示工程名,类似html的\<h1\> 你只要在标题下面跟上=====即可 中标题 ------- ...
- HDFS删除并清空回收站
删除文件并放入回收站: hdfs dfs -rm -f /path 删除文件不放入回收站: hdfs dfs -rm -f -skipTrash /path 清空回收站: hdfs dfs -expu ...
- Hive 性能调优
避免执行MR select * or select field1,field2 limit 10 where语句中只有分区字段或该表的本地字段 使用本地set hive.exec.mode.local ...
- nginx资源争夺问题
nginx资源争夺问题 多个配置之间存在资源争夺的情况,需要进行整理: 学习了:https://blog.csdn.net/veryisjava/article/details/72917894 ng ...