收集参数模式(Collecting Parameter)
该设计模式,比较好理解,顾名思义,就是收集参数,但是在什么场景下应该收集参数才是我们要关心的!在Junit测试框架中,failure与error是区别来的,failure是对于assertions的个检查,而error是未能预料的个错误,在测试框架始运行到结束,期间发生的是error还是failure,对于客户端来说要详细的记录并展现,自始至终使用TestResult类记录这个过程中的各种结果,那么TestResult就好比个收集数据的容器,并且被当作个参数传递给测试过程中涉及到的方法;这时候你可以回头看看始第篇总览这篇文章中的流程分析图,重点看看TestResult类在其中扮演了什么角色。
下面的声明是TestResult类的注释,明确说明这个是收集参数模式。如下:
/**
-
A <code>TestResult</code> collects the results of executing
-
a test case. It is an instance of the Collecting Parameter pattern.
-
The test framework distinguishes between <i>failures</i> and <i>errors</i>.
-
A failure is anticipated and checked for with assertions. Errors are
-
unanticipated problems like an <code>ArrayIndexOutOfBoundsException</code>.
-
@see Test
*/
public class TestResult extends Object {
protected Vector fFailures;
protected Vector fErrors;
protected Vector fListeners;
protected int fRunTests;
private boolean fStop;
public TestResult() {
fFailures= new Vector();
fErrors= new Vector();
fListeners= new Vector();
fRunTests= 0;
fStop= false;
}
.......
}
在TestSuit被组装好之后,会调用内部的每个testcase的run方法,并且将TestResult作为参数传递过去:
/**
- Runs the tests and collects their result in a TestResult.
*/
public void run(TestResult result) {
for (Enumeration e= tests(); e.hasMoreElements(); ) {
if (result.shouldStop() )
break;
Test test= (Test)e.nextElement();
//result被当作参数传递
runTest(test, result);
}
}
一旦测试过程中出现错误或者失败,就会调用相应的方法,如出现错误时,调用代码如下:
/**
-
Adds an error to the list of errors. The passed in exception
-
caused the error.
*/
public synchronized void addError(Test test, Throwable t) {
// 这里把错误对象放在vector中,收集错误信息
fErrors.addElement(new TestFailure(test, t));
//这部分代码是作为观察着模式的目标对象的职能,通知各个监听者
for (Enumeration e= cloneListeners().elements(); e.hasMoreElements(); ) {
((TestListener)e.nextElement()).addError(test, t);
}
}
在测试结束后,返回的结果TestResult对象,我们看看客户端所实现TestRunner的doRun方法:
//返回的结果就是TestResult对象,收集了测试过程中的测试信息public TestResult doRun(Test test) {
return doRun(test, false);
}
通过收集的这些测试信息,客户端终会进行各自 同的展现;强烈建议此时回头再看看第篇中所画的 测试流程分析图》。
Junit测试框架对于单个和组合测试用例,是能够满足要求的,但是针对其他比较特殊的应用,比如反 测试,测试过滤等场景,就要通过扩展其功能实现了,这就是下节所讲的装饰模式,精彩继续!
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于