Junit

1.单元测试可以降低不确定性从而降低风险

2.单元测试可以把您优化设计

一般来说,写代码可测试代码最好不要是同一个人。

3.单元测试用例可以当文档使用。

单元测试—单元测试测的是独立的一个工作单元。在Java应用程序中“独立的一个工作单元”常常指的是一个方法。作为对比,集成测试和接收测试则检查多个组件如何交互。一个单元是一项任务,它不依赖与其他任何任务的完成。

1.3理解单元测试框架

遵循3条规则:

1.每个单元测试都必须独立于其他单元测试而运行

2.必须以单项测试为单位来检测和报告错误

3.必须易于定义要运行哪些单元测试。

Junit团队为框架设立了3个具体目标:

框架可以帮助我们编写有用的测试。

框架必须帮助我们创建随着时间的过去依旧保持有用的测试

框架必须通过复用代码降低我们编写测试的成本

TestCase + TestSuit + BaseTestRunner = TestResult

TestCase(测试用例)--扩展了Junit的TestCase类的类。它以testXXX方法的形式包含一个或多个测试。

TestSuite(测试集合)--一组测试。一个test suite是把多个相关测试归入一组的便捷方式。例如,你没有为TestCase定义一个test suite,那么Junit就会自动提供一个test suite,包含TestCase中所有的测试。


TestRunner(测试运行器)--执行test suite的程序。Junit提供了几个test runner,你可以用他们来执行你的测试。没有TestRunner接口,只有一个所有test runner都继承的BaseTestRunner。因此,当我们编写TestRunner的时候,我们实际上指的是任何继承BaseTestRunner的test runner类。

类/接口 责任

Assert 当条件成立时assert方法保持沉默,否则抛出异常

TestResult 包含了测试中发生的所有错误或者失败

Test 可以运行Test并把结果传递给TestResult

TestListener 测试中若产生事件(开始、结束、错误、失败)会通知TestListener

Testcase 定义了可以用于运行多项测试的环境

TestSuite 运行一组test case,他们是Test的组合

BaseTestRunner test runner是用来启动测试的用户界面,BasetTestRunner是所有test runner的超类


Keep the bar green to keep the code clean

Test被设计成可以运行一个或多个test case,test runner负责启动TestSuite,需要哪些test case则由TestSuite来决定。

设计模式实战:Composite模式和Command模式

Composite模式。把对象组合成树状结构来表示部分-整体层次关系。Composite模式可以让客户一致地对待单个对象和和对象的组合。Junit用Test接口来运行一个单独的测试,或者是多个测试的集合的集合的集合,这就是Composite模式的例子。

当你给TestSuite增加一个对象时,你实际上增加的是Test,而不只是一个TestCase,因为TestSuite和TestCase都实现了Test接口。你既可以向TestSuite加入一个TestSuite也可以加入一个TestCase。如果是TestCase,那么就会运行那个单独的测试,如果是TestSuite,那么就会运行一组测试。

Command模式。“把请求封装成一个对象,这样就可以用不同的请求、队列或者日志请求把客户参数化,还能支持可撤销的操作”。使用Test接口来提供公共的run方法是Command模式的例子。

用TestResult来收集参数

所有的TestSuite都有一个对应的TestResult。

TestResulte负责收集TestCase的执行结果。

Junit区分失败和错误:
失败是可预期的
但错误则是测试时不可预料的

当遇到错误时,好的分析步骤是:

1.检查环境

2.检查测试

3.检查代码

设计模式实战:Collecting Parameter模式

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

用TestListener来观察结果

TestResult收集了关于测试的信息,TestRunner则负责报告信息。

Junit框架提供了TestListener接口,以帮助对象访问TestResult并创建有用的报告。TestRunner实现了TestListener,很多特定的Junit扩展也实现了TestListener。

设计模式实战:Observer模式

在对象之间定义一个一对多的依赖关系,这样一个当对象改变了状态,那么所有依赖于它的对象都会自动收到通知并更新。TestRunner以TestListener的身份注册到TestResult,这是Observer模式的例子。

TestCase来工作

Junit的工作过程就是由TestRunner来运行一个包含一个或多个TestCase(或者其他TestSuite)的TestSuite。

典型的TestCase包含两个主要部件:fixture和单元测试。

用fixture来管理资源

fixture–运行一个或多个测试所需的公用资源或数据集合。

TestCase通过setUp和tearDown方法来自动创建和销毁fixture。TestCase会在运行每个测试之前调用setUp,并且每个测试完成之后调用tearDown。把不只一个测试方法放进统一个TestCase的一个重要理由就是可以共享fixture代码。

start–setUp()–>testXXX()—>tearDown()–end

创建单元测试方法

Assert超类型

保持测试的独立性

每项单元测试都独立于其他所有单元测试而运行

下面是相互依赖会造成的问题:

1.不具可移植性

2.难以维护

3.不够清晰

单元测试的要点在于,一次只测试一个对象。在Java这样的面向对象环境中,对象被设计成要同其他对象交互。为了创建一个单元测试,你需要两种类型的对象,你要测试领域对象和同被测试的对象交互的测试对象。

定义 领域对象–在单元测试的语境中,术语领域对象用来突出你在应用程序中使用的对象,并将之痛用来测试应用程序的对象(测试对象)相对比。任何被测试的对象都被看做是领域对象。