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方法。
Junit 内部解密之二: TestResult + TestListener + Assert的更多相关文章
- Junit 内部解密之一: Test + TestCase + TestSuite
转自:http://blog.sina.com.cn/s/blog_6cf812be0100wbhq.html nterface: Test 整个测试的的基础接口 Method 1: abstract ...
- Junit内部解密之四: Junit单元测试最佳实践
我们做使用Junit工具来做单页测试或接口测试时,需要注意一些问题,包括我们的编码规范,test规范,以及编写测试代码的策略,以下个人的总结. 1.为还没有实现的测试代码抛出一个异常.这就避免了该测试 ...
- Junit内部解密之三: 单元测试用例运行的全过程
转自:http://blog.sina.com.cn/s/blog_6cf812be0100x8sb.html 我们以一个非常简单的TestCalculator类为例,只有一个测试方法: Public ...
- JVM 内部原理(二)— 基本概念之字节码
JVM 内部原理(二)- 基本概念之字节码 介绍 版本:Java SE 7 每位使用 Java 的程序员都知道 Java 字节码在 Java 运行时(JRE - Java Runtime Enviro ...
- Junit单元测试学习笔记二
我们使用Eclipse自动生成了一个测试框架,在这篇文章中,我们来仔细分析一下这个测试框架中的每一个细节,知其然更要知其所以然,才能更加熟练地应用JUnit4. 一. 包含必要地Package ...
- JUnit + Mockito 单元测试(二)(good)
import org.junit.Test; import org.mockito.Matchers; import org.mockito.Mockito; import java.util.Lis ...
- Junit初级编码(二)探索JUnit核心
序,Junit测试是单元测试的一个框架,提供了很多方法,供我们快速开展单元测试.现在就让我们慢慢学习Junit单元测试框架 一.Junit的三个核心概念测试类.测试集.测试运行器 1 测试类 公共的, ...
- JUnit + Mockito 单元测试(二)
摘自: http://blog.csdn.net/zhangxin09/article/details/42422643 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 入门 ...
- Junit使用教程(二)
二.核心——断言 断言是编写测试用例的核心实现方式,即期望值是多少,测试的结果是多少,以此来判断测试是否通过. 1. 断言核心方法 assertArrayEquals(expecteds, actua ...
随机推荐
- 洛谷——P1170 兔八哥与猎人
P1170 兔八哥与猎人 题目描述 兔八哥躲藏在树林旁边的果园里.果园有M × N棵树,组成一个M行N列的矩阵,水平或垂直相邻的两棵树的距离为1.兔八哥在一棵果树下. 猎人背着猎枪走进了果园,他爬上一 ...
- java中split任意数量的空白字符
java程序中经常通过split截取字符串来取得其中的关键字.但是由于其中不同操作系统或者不同作者的习惯,经常会出现不同数量的空格,例如" "(3个空格):或者出现制表符.Ta ...
- socket 和 webservice 的区别和比较
时间紧迫,我就直奔主题. 目前需要说服客户使用webservice 而不是socket. 我觉得要先分别解释下什么是socket 什么是webservice..这个要我该怎么说才比较形象,让人一定就明 ...
- LINUX 下mysql导出数据、表结构
1.首先要确认mysqldump命令所在路径 例如,我的在:/usr/bin/ 下 [root@sf105113 bin]# which mysqldump /usr/bin/mysqldump 2. ...
- NDK安装教程 not a valid ndk directory -- Eclipse
第一步:下载 Eclipse IDE for Java Developers http://www.eclipse.org/downloads/ 第二步:下载CDT http://www.eclips ...
- AutoCAD中导入图片
导入图片涉及到两个关键的问题:如何将图片放置到指定的位置或范围内:如何修改图片的路径类型,如相对路径.绝对路径. 本文以AutoCAD 2018位演示截图来源. 1 将图片放置到指定的位置或范围内 ( ...
- 字母数字、字母、汉字验证码 (java)
原文:http://blog.csdn.net/qh_java/article/details/49854477 一.字母数字,字母,汉字验证码的生成代码 1.字母数字验证码: package com ...
- VUE -- 十分钟入门 Less
这篇文章来自 Danny Markov, 是我最喜欢的博主之一,实际上我最近翻译的一些文章全是出自他手.在查看本文之前你也可以 查看原文. 我们都知道写 CSS 代码是有些枯燥无味的,尤其是面对那些成 ...
- Python中使用XMLRPC(入门)
一.简介 RPC是Remote Procedure Call的缩写,翻译成中文为:远程方法调用. 它是一种在本地机器上调用远端机器上的一个过程(方法)的技术,这个过程也被大家称为“分布式计算”,是为了 ...
- [转载] K3 K3c 最简单无损开壳方法
只用一把螺丝刀就行了,其它什么撬棒 信用卡 撬片等 拆机工具一概不用.拆了5台,只有一台断了一个扣口. 1. 把底部4个螺丝拿掉.2.把路由如图放在桌子上,路由平行于身体,注意是立着放 使路由与桌 ...