CppUnit 测试类注册过程

来源:互联网 发布:驾校发展数据 编辑:程序博客网 时间:2024/05/16 01:31

--------------------------------------------------------------------------------------
1. 实现一个最简单的测试类
--------------------------------------------------------------------------------------

 

可以看到整个过程如下:

 

1. 从 CPPUNIT_NS::TestFixture 派生

2. 注册该类 CPPUNIT_TEST_SUITE_REGISTRATION (UT_MyTest);

3. 实现 setUp 和 tearDown (如果需要)

4. 添加测试函数 UT_FormatString
    CPPUNIT_TEST_SUITE(UT_MyTest);

    CPPUNIT_TEST(UT_FormatString);

    CPPUNIT_TEST_SUITE_END();

5. 实现测试函数 UT_FormatString

--------------------------------------------------------------------------------------
2. 注册测试类
--------------------------------------------------------------------------------------

先看看注册测试类,也就是 CPPUNIT_TEST_SUITE_REGISTRATION (UT_MyTest); 后面干了什么

#define CPPUNIT_TEST_SUITE_REGISTRATION( ATestFixtureType )      /
  static CPPUNIT_NS::AutoRegisterSuite< ATestFixtureType >       /
             CPPUNIT_MAKE_UNIQUE_NAME(autoRegisterRegistry__ )

这里也就是相当于定义了一个全局静态变量
static CPPUNIT_NS::AutoRegisterSuite< UT_MyTest > autoRegisterRegistry__75; (75代表当前的代码行数)

这里利用了C++的几个特性
1) 定义一个 static 全局变量,只在本文件内可见,避免了后面的 autoRegisterRegistry__75 变量名重名。
事实上,如果你在几个cpp文件中 include 这个头文件,会发现 UT_MyTest 内的测试函数会被调用多次
2) 全局变量会在 main 函数调用之前构造,也就是 CPPUNIT_NS::AutoRegisterSuite 的构造函数会被先调用

这样我们可以看到注册过程就是在 CPPUNIT_NS::AutoRegisterSuite 的构造函数中实现的 :



这里 m_registry->registerFactory( &m_factory ); 的实现就先不去关注了。
看看这里又定义了一个类 TestSuiteFactory<UT_MyTest>



也就是最终生成测试实例时,还是调用的 UT_MyTest::suite()

--------------------------------------------------------------------------------------
3. 添加测试用例
--------------------------------------------------------------------------------------

在我们的测试类 UT_MyTest 什么时候实现了 suite() ?
嗯,这里还有三个宏:

CPPUNIT_TEST_SUITE(UT_MyTest);

CPPUNIT_TEST(UT_FormatString);

CPPUNIT_TEST_SUITE_END();

把它们展开并进行简化后,就是这样的:



也就是 suite 的实现隐藏在
CPPUNIT_TEST_SUITE(UT_MyTest);
CPPUNIT_TEST(UT_FormatString);
CPPUNIT_TEST_SUITE_END();
这三个宏中间。

要读懂这一大段代码,必须分析理解一下 CppUnit 中的一些术语或概念
CppUnit 中有一个基类定义所有的测试
class CPPUNIT_API Test

从这里派生了一系列类
Test
  |--------------------|
TestLeaf          TestComposite
  |                    |
TestCase          TestSuite
  |
TestCaller

可以看到往下有了两个分支
TestLeaf,TestCase,TestCaller 这一族代表了一个具体的测试用例,比如 UT_MyTest::UT_FormatString,
它从事具体的测试工作

TestComposite 和 TestSuite 则更像一个容器,包含了一系列的测试用例 (TestCase 或 TestCaller)。

所以可见 UT_MyTest::suite() 的实现基本就是创建一个 TestSuite,然后往里面添加一系列的 TestCaller。

其中 suite() 就是创建这个 TestSuite,
而 addTestsToSuite 则往里面添加 TestCaller
这些 TestCaller 就是包含在 CPPUNIT_TEST (...) 中的测试函数了