我们看到,上面创建了一个TestInfo对象,然后通过AddTestInfo注册了这个对象。TestInfo对象到底是一个什么样的东西呢?
TestInfo对象主要用于包含如下信息:
1. 测试案例名称(testcase name)
2. 测试名称(test name)
3. 该案例是否需要执行
4. 执行案例时,用于创建Test对象的函数指针
5. 测试结果
我们还看到,TestInfo的构造函数中,非常重要的一个参数就是工厂对象,它主要负责在运行测试案例时创建出Test对象。我们看到我们上面的例子的factory为:
new ::testing::internal::TestFactoryImpl< FooTest_Demo_Test> |
template <class TestClass> class TestFactoryImpl : public TestFactoryBase { public: virtual Test* CreateTest() { return new TestClass; } }; |
这个对象工厂够简单吧,嗯,Simple is better。当我们需要创建一个测试对象(Test)时,调用factory的CreateTest()方法就可以了。
创建了TestInfo对象后,再通过下面的方法对TestInfo对象进行注册:
GetUnitTestImpl()->AddTestInfo(set_up_tc, tear_down_tc, test_info); |
GetUnitTestImpl()是获取UnitTestImpl对象:
inline UnitTestImpl* GetUnitTestImpl() { return UnitTest::GetInstance()->impl(); } |
其中UnitTest是一个单件(Singleton),整个进程空间只有一个实例,通过UnitTest::GetInstance()获取单件的实例。上面的代码看到,UnitTestImpl对象是最终是从UnitTest对象中获取的。那么UnitTestImpl到底是一个什么样的东西呢?可以这样理解:
UnitTestImpl是一个在UnitTest内部使用的,为执行单元测试案例而提供了一系列实现的那么一个类。(自己归纳的,可能不准确)