Junit区分失败和错误.失败是可以预期的,代码中的改变不会造成断言失败.你只要修正代码,断言可以通过.
但是错误(比如常规程序抛出的异常)则是测试时不能预料的.
当遇到错误,好的分析步骤是:
检查环境;
检查测试;
检查代码;
2.5 用TestListener来观察结果
TestResult收集了测试的信息,TestRunner负责报告信息. Junit 提供了TestListener接口,以帮助对象访问TestResult
并创建有用的报告.
TestRunner实现了TestListener,很多特定的Junit扩展也实现了TestListener 可以有任意数量的TestListener向Junit
框架注册.这些TestListener可以根据TestResult提供的信息做它需要做的任何事情
2.6 用TestCase来工作
概括的说,Junit的工作过程是由TestRunner来运行包含一个或多个TestCase的TestSuite,但是在常规工作中,你只和
TestCase打交道.
典型的TestCase包含两个部件:fixture和单元测试
2.6.1 用Fixture来管理资源
有些测试需要一些资源,要把这些资源配置好是一件麻烦事,比如像数据库连接这样的资源是典型的例子.
把通用的资源配置代码放在测试里可能不是一个好主意,
TestCase通过setUp 和tearDown方法来创建和销毁fixture.TestCase会在运行前调用setUp,并在每个测试完成后调用tearDown
把不止一个测试方法放入同一个TestCase的好处是可以共享Fixture代码.
Junit通过Assert接口提供的工具方法来复用代码.
2.6.2 创建单元测试方法
使用Fixture是复用代码的好方法,但是还有很多常见的测试任务,很多测试都会重复执行这些任务,Junit框架用一组assert方法封装了
常见的测试任务.这些assert方法可以极大的简化单元测试的编写.
Assert超类型
TestCase成员
除了Assert提供的方法之外,TestCase还实现了10个它自己的方法,
保持测试的独立性
你在开始编写自己的测试的时候,记住第一条规则:每个单元测试都必须独立于其他单元测试而运行.单元测试必须能以任何顺序来进行,一项测试不能依赖与前面的测试造成的改变,下面是会相互依赖的测试所造成的问题:
不具可移植性
难以维护
不够清晰
2.7创建TestCaculator的全过程
2.7.1创建TestSuite
TestRunner一开始寻找TestCaculate类中的suite方法.若找到了直接调用它,这个suite方法会创建不同的
TestCase类,并把他们加入到不同的TestSuite.
因为TestCaculate没有suite方法,所以TestRunner创建了一个默认的TestSuite对象.
2.7.2 创建TestResult
步骤如下:
1. 在图中1处,TestRunner实例化了一个TestResult对象,在测试顺序执行的时候,这个对象将用来存放测试结果;
2. TestRunner像TestResult注册测试,这样在执行测试的过程中TestRunner可以收到各种事件,这是Observe模式的典型例子,TestResult会广播如下方法:
测试开始(startTest);
测试失败(addFailure);
测试抛出未被预期的异常(addErr);
测试结束(endTest);
3. 知道了这些事件,TestRunner可以随着测试的进行而显示进度条,并且在测试失败和错误的时候显示出来.
4. TestRunner通过调用TestSuite的run方法开始测试.
5. Testsuite为它拥有的每个TestCase实例调用Run(TestResult)方法.
6. TestCase通过传递给它的TestTesult实例来运行run(Test)方法,并把自身作为参数传递给Run方法,这样TestResult梢后用runBare回调它
2.7.3 执行测试方法
图2.10描绘了执行单个测试方法的步骤.步骤如下:
1. 在图中5处,runBare方法顺序执行setup,testAdd,和tearDown方法.
2. 如果在执行这3个方法的过程中发生了任何失败和错误,那么TestResult会分别调用addFailure和addError
来通知所有的Listener
3. 如果发生任何错误,那么TestRunner会列出这些错误,否则进度条是绿色的,从而让你知道没有问题.
4. 当tearDown执行完成后,整个测试过程完成了,Testresult会调用endTest把这个结果通知给所有的listener.
2.7.4 复习完整的Junit生命周期
第三章:Junit实例
Tests are the programmer’s stone, transmuting fear into boredom.
测试是程序员之石,把恐惧变成厌倦;
3.1 引入Controller组件
3.1.1设计接口
public interface Request {
String getName();
}
public interface Response {
}
public interface RequestHandler {
public Response process(Request request) throws Exception;
}
public interface Controller {
Response processRequest(Request request);
void addHandler(Request request,RequestHandler handler);
}