如何在CppUnit测试套件中实现“类别”?

时间:2013-01-29 04:44:16

标签: cppunit

this question密切相关,我希望能够根据命令行参数选择要在CppUnit程序集中执行的测试。考虑--exclude=integration,smoke,x64only--include=unitNUnit Categories就像这样工作。 如何在CppUnit中实现类似的功能?

我尝试使用方法IHasCategories添加抽象基类get_Categories()的路径,并且我的测试装置覆盖了返回以逗号分隔的类别列表的方法。但是,当我们通过CppUnit::Test *topLevelTest = CppUnit::TestFactoryRegistry::getRegistry().makeTest();之类的调用从CppUnit检索测试时,我们得到CppUnit::Test的实例。 我真正需要的是CppUnit::TestFixture的一个实例来获取我要检查的类别列表。

1 个答案:

答案 0 :(得分:0)

当你知道答案时,结果很简单,所以这里是为了任何未来的读者。

正如我在问题中提到的,我用方法IHasCategories编写了一个抽象基类get_Categories(),我的测试装置覆盖了返回以逗号分隔的类别列表的方法。 / p>

这个难题的缺失部分是如何从CppUnit中获取CppUnit::TestFixture的实例。事实证明,CppUnit为您提供了CppUnit::Test个对象的层次结构,您只需dynamic_cast将这些对象添加到您想要的类中。

以下代码有点针对我的需求,但可能会有所帮助。此方法提供层次结构中的对象列表,这些对象分层地表示TestFixtures。这是我用test->run(&controller);之类的命令执行的列表中的对象。当我想检查类别的实际TestFixture对象时,我想将这些对象的子对象动态地广播到IHasCategories

/**
 * Get TestSuite objects from the CppUnit hierarchy, that have, as their children,
 * TestFixture objects.
 */
void GetTestSuitesWithFixtures(const CppUnit::Test * test, std::vector<CppUnit::Test*> & suites)
{
    for (int childIndex = 0; childIndex < test->getChildTestCount(); ++childIndex)
    {
        CppUnit::Test * child = test->getChildTestAt(childIndex);

        CppUnit::TestSuite * testSuite = dynamic_cast<CppUnit::TestSuite*>(child);

        if (testSuite 
            && testSuite->getChildTestCount() > 0
            && dynamic_cast<CppUnit::TestFixture*>(testSuite->getChildTestAt(0)))
        {
            suites.push_back(testSuite);
        }
        else GetTestSuitesWithFixtures(child, suites);
    }
}