学习笔记:解读CppUnit源码3

来源:互联网 发布:高级java软件工程师 编辑:程序博客网 时间:2024/05/22 01:49

 Test类就是抽象我们的测试用例的,那么Test类是直接new来创建的吗?当然不是的。在创建设计模式中,有一种创建叫做TestFactory。就是工厂模式。

TestFactory.h

既然Test类是抽象类,那么工厂当然也是抽象的也就不奇怪了。对应装置器也应该有一个创建工厂:TestFixtureFactory

TestFixtureFactory.h

TestFixtureFactory是对应抽象的类,ConcretTestFixtureFactory当然是实现类了,而ConcretTestFixtureFactory类也用到了类模板。这个类模板参数是什么就从工厂里创建什么类。在用宏来创建对象的情况下,这个设计是相当的灵活阿。

下面再看看第三个工厂。也是一个很重要的工厂:TestSuiteFactory

TestSuiteFactory.h

这个工厂也用了模板参数,作用嘛和第二个讲的道理一样。调用指定类的suite方法,那么suite方法是在哪里的呢?是在CPPUNIT_TEST_SUITE_END宏所展开的代码里。也就是调用主测类的一个叫suite名字的静态方法。

下面回到工厂的正题:TestFactory的实现类,

TestFactoryRegistry.h

TestFactoryRegistry.cpp

TestFactoryRegistryList类存在于TestFactoryRegistry.cpp中,是用来管理测试用例工厂的类

关于TestFactoryRegistry的代码个人觉得比较难懂。首先想说明的是TestFactoryRegistryList里面其实是一组测试用例工厂,每个工厂是以名字为关键字,所以工厂list的主要数据结构是map。而TestFactoryRegistry的数据结构set中,包含的是自身,所以这样就有了层次结构了。当然在真实的代码中,TestFactoryRegistryList是inner class。

下面介绍最后一个与创建相关的类:

AutoRegisterSuite.h

又看到模板类的参数了,TestCaseType的作用和前面一样,为了让类增加灵活性。而它的两个聚合物一个是TestFactoryRegistry,而另一个是TestSuiteFactory<TestCaseType>,这个用来管理调用具体主测类的Suite的创建的工厂。

有些人一定也注意到了,TestFactoryRegistry的父类是TestFactory,而TestSuiteFactory的父类也是TestFactory。所以说白了这里就是将一组测试包(TestSuiteFactory)注册到TestFactoryRegistry中。那么如果名字相同怎么办呢?这个嘛TestFactoryRegistry::getRegistry(name)是单例模式,是否注册就让它去决定把。(单例嘛当然只有一份实体)。

原创粉丝点击