学习笔记:解读CppUnit源码5

本文深入剖析了CPPUnit测试框架的内部结构与工作原理,重点介绍了SynchronizedObject、TestListener及TestResult等核心组件的作用与实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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的关系是使用与被使用的关系。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

进击的横打

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值