cppUnit是支持多线程模式下测试的一种方法,在阅读TestListener之前我们不妨看看SynchronizedObject里面到底有什么东西。
SynchronizedObject用来管理一个被同步对象,它定义了一个public属性的abstract inner class——SynchronizationObject,代表具备同步属性的对象
MfcSynchronizationObject中,用CCriticalSection临界区来实现同步的。
SynchronizedObject还定义了一个protected属性的inner class——ExclusiveZone
说白了ExclusiveZone类就是对SynchronizationObject对象的控制辅助。
接下来再看SynchronizedObject就简单了,SynchronizedObject就是对SynchronizationObject的指针对象m_syncObject的控制。其实SynchronizedObject类就是一个管理同步的类,有了两个inner类后,才感觉阅读起来有点复杂。不过这样设计其实也是为了扩展需要,同步的方法不止一种,可以继承SynchronizationObject后重载lock()和unlock()方法来实现具体如何同步。
终于可以讲TestListener了。
BriefTestProgressListener.h加入了是否要输入错误信息的标志
TextTestProgressListener.h
TestSuccessListener.h
TestSuccessListener只关心测试用例是否运行成功,如果失败的话会调用addFailure()这个方法,调用后就知道该测试用例失败了。reset()是在开始或者重新开始的时候使用。把测试成否的标志置为真。多重继承自SynchronizedObject顾名思义是为了实现多线程。
TestResultCollector.h
在这个类里面,聚集了Test的对象链表和TestFailure的对象链表。既然有了这2样东西,想如何输出或想怎样输出测试用例的错误就比较方便了,只要在输出类里面包含一下这个类就可以了。其实这个才是真正的Listener。
最后说明一下TestResult.h这个类
在TestResult里面m_listeners是一个链表。当调用TestResult::startTest(),TestResult::endTest()
TestResult::startSuite(),TestResul::endSuite()当其中一个方法被调用的时候,m_listeners链表里所有的成员里都会遍历访问一遍。这个就是访问者模式。这里的listener机制个人觉得就是命令模式和访问者模式的结合。
这里还有一个之前讲过的ProtectorChain的控制,保护者也作成了一个链表,添加删除的操作是pushProtector()和popProtector()。TestResult::protect()就是保护机构的核心接口。
讲到这里大家应该对TestResult的结构和方法已经很了解了,再在这里总结一下。TestResult里面有两个链表是关键,当外部对保护者链表和监听者链表访问时就是一个观察者模式。个子类会分别相应TestResult接口的变化。真正的监听者是TestSuccessListener的子类:TestResultCollector,而真正的保护者是Protector的子类:DefaultProtector。TestResult继承SynchronizedObject以实现多线程。TestResult与Test的关系是使用与被使用的关系。