Junit 内部解密之二: TestResult + TestListener + Assert

转自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhw.html

之前我们看到了Test接口里面的run方法有个TestResult的参数,不错,这个类就是用来收集测试结果的,是收集TestSuite的运行结果,所以一般情况下,一个TestSuite对应一个TestResult. TestResult存储了所有测试的详细情况,是通过还是失败。

如果是失败:Junit会创建一个TestFailure对象,并保存在TestResult中。

这里知道了TestResult的作用,这种做法也会引入另外一个设计模式。

Java设计模式:Collecting Parameter模式

定义:当你需要从几个方法中收集结果时,你应当给方法增加一个参数,并传递一个会替你收集参数的对象。

这里TestResult类就是起到了这个作用。但是我们知道TestResult是收集很多运行的Test的运行结果,这里就需要对于这些运行结果进行管理,则TestResult类定义了如下相关的方法:

public synchronized void addError(Test test, Throwable t)    新增一个错误到ArrayList<TestFailure>。

public synchronized void addFailure(Test test, AssertionFailedError t)  新增一个失败到ArrayList<TestFailure>。

public synchronized void addListener(TestListener listener)   在一个test中注册一个监听器到ArrayList<TestListener>,这个监听器就是TestListener,实现类是TestRunner。

public synchronized void removeListener(TestListener listener)   从一个test中取消这个监听器。

private synchronized List<TestListener> cloneListeners()    克隆一批监听器。

我们已经知道了TestResult的作用,那么TestListener的作用又是什么呢?在Run一个测试用例的时候有很多的结果,这时就由TestListener去观察这个运行的结果,并且负责报告这些运行信息。

TestListener是个接口,一般由Test Runner,很多特定的Junit扩展也实现了这个接口,我们来看下这个接口里面定义了哪些方法:

public void addError(Test test, Throwable t);   发送错误的时候才被调用。

public void addFailure(Test test, AssertionFailedError t);     失败的时候才被调用。

public void endTest(Test test);     测试结束时被调用。

public void startTest(Test test);    测试开始时被调用。

由于定义了这个TestListener接口和实现类TestRunner的作用都看到了,特别是给扩展Junit提供了新的实现类的方式,这样的做法就引出了一个设计模式。

Java设计模式:Observer模式

定义:在对象之间定义了一个一对多的依赖关系,这样当一个对象改变了状态,那么所有依赖于它的对象都会自动收到通知且更新。目前Junit框架的TestRunner就以TestListener的身份注册到TestResult。

我们在写testcase的时候,都会用到Assert方法去check运行结果,这时候的Assert方法是继承了Junit的TestCase类,但是你如果还记得TestCase类的声明的话,那就是TestCase不仅仅实现了Test接口,而且也继承了Assert类,其实这些Assert方法就是Assert类中实现的。

Junit的Assert类中总共有38个Assert方法,但很多都是不停的重载,其实就只有8个核心方法:

assertTure; assertFalse; assertEquals; assertNotEquals; assertNull; assertSame; assertNotSame; fail(让测试失败,并给出指定的信息)

一般要用到抛出message的都会用到fail方法。

时间: 2024-08-28 06:34:43

Junit 内部解密之二: TestResult + TestListener + Assert的相关文章

Junit内部解密之三: 单元测试用例运行的全过程

转自:http://blog.sina.com.cn/s/blog_6cf812be0100x8sb.html 我们以一个非常简单的TestCalculator类为例,只有一个测试方法: Public class TestCalculator extends TestCase { Public void testAdd() { Calculator calculator = new Calculator(); Double result = calculator.add(10, 50); ass

内部链接十二条网页黄金规则

seo似乎有个潜在的规则:seo优化中最不起眼的东西,最难学到的东西,就是网页的链接规则了,有关seo,网上流行一句话:内容为王,外链为皇.其实seo在你达到一定境界,接手的网站上了一定的规模的时候,网页的链接也就是所谓的网站内部链接就成了重中之重,seo这个行业高层也流行一句话:小网站靠外链,大网站靠内链.这些都是长时间致力于seo行业的朋友们总结出来的经验之谈. 进入主题:内部链接十二条网页黄金规则 一:首页的logo图片都链向主页. 二:所有页的logo图片都链向主页. 三:页面导航,不要

JVM内部细节之二:偏向锁(Biased Locking)

在前面一片文章<JVM内部细节之一:synchronized关键字及实现细节>中已经提到过偏向锁的概念,在理解什么是偏向锁前必须先理解什么是轻量级锁(Lightweight Locking).引入偏向锁是为了在无多线程竞争的情况下尽量减少不必要的轻量级锁执行路径,因为轻量级锁的获取及释放依赖多次CAS原子指令,而偏向锁只需要在置换ThreadID的时候依赖一次CAS原子指令(由于一旦出现多线程竞争的情况就必须撤销偏向锁,所以偏向锁的撤销操作的性能损耗必须小于节省下来的CAS原子指令的性能消耗)

Junit单元测试学习笔记二

我们使用Eclipse自动生成了一个测试框架,在这篇文章中,我们来仔细分析一下这个测试框架中的每一个细节,知其然更要知其所以然,才能更加熟练地应用JUnit4. 一.     包含必要地Package 在测试类中用到了JUnit4框架,自然要把相应地Package包含进来.最主要地一个Package就是org.junit.*.把它包含进来之后,绝大部分功能就有了.还有一句话也非常地重要“import static org.junit.Assert.*;”,我们在测试的时候使用的一系列assert

JUnit + Mockito 单元测试(二)

JUnit 是单元测试框架.Mockito 与 JUnit 不同,并不是单元测试框架(这方面 JUnit 已经足够好了),它是用于生成模拟对象或者直接点说,就是"假对象"的工具.两者定位不同,所以一般通常的做法就是联合 JUnit + Mockito 来进行测试. 入门 首先是配置 Mock 对象,看看例子怎么写的. [java] view plain copy List mock = mock( List.class ); when( mock.get(0) ).thenReturn

Junit学习笔记(二): 源码分析(1)

使用ModelGoon画出来的UML图如下: 图中可以分析出: 1)Test是一个接口,TestSuit和TestCase,JUnit4TestAdapter,JUnit4TestCaseFacade都实现了Test类,这一种命令模式,只需要使用Test接口就可以使用到具体的类: 2)JUnit4TestAdapter是适配器, Filterable实现了对用例的过滤, Sortable实现了对用例的排序(按照字母进行排序): 3)TestResult实现了返回结果,TestFailure记录失

Junit使用教程(二)

二.核心——断言 断言是编写测试用例的核心实现方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过. 1. 断言核心方法 assertArrayEquals(expecteds, actuals) 查看两个数组是否相等. assertEquals(expected, actual) 查看两个对象是否相等.类似于字符串比较使用的equals()方法 assertNotEquals(first, second) 查看两个对象是否不相等. assertNull(object) 查看对象是否为

字符串的加密与解密(二)

二.可逆加密 以下的几种加密和解密均要添加对System.Security.Cryptography命名空间的引用: using System.Security.Cryptography; 1.DES public class DESDemo { /// <summary> /// 向量 /// 向量的长度为8位,也就是DES算法的块大小,经本人亲测,若小于8位程序会抛出异常, /// 若大于8位,则8位以后的不起作用. /// 字节数组里的值可以根据个人需要进行更改 /// 这个参数也可使用

Openssl及加密解密(二)openssl

openssl是一个条件实现了上百种算法.实现了单向加密工具等一组套件,代码量很小但是功能强大.它有三部分组成: libcrypto:通用功能的加密库,软件开发时可以直接调用 libssl:实现TLS/SSL的功能 openssl:多功能命令行工具,加密.解密.创建CA.证书.一对秘钥等 openssl enc加密解密命令: 参数 说明 -des3 是指定加密算法 -a 是输出文件按base64内容输出,否则就是二进制的 -in 要加密的文件 -out 加密后的文件 -salt 加盐 -d 表示