0

与这个问题密切相关,我希望能够根据命令行参数选择要在 CppUnit 程序集中执行的测试。想想--exclude=integration,smoke,x64only--include=unitNUnit 类别就是这样工作的。如何在 CppUnit 中实现类似的东西?

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

4

1 回答 1

0

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

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

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

以下代码有点特定于我的需求,但可能会有所帮助。此方法提供层次结构中的对象列表,这些对象以层次结构表示 TestFixture。我使用类似的命令执行此列表中的对象test->run(&controller);。当我想检查类别的实际 TestFixture 对象时,我想将这些对象的子对象 dynamic_cast 为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);
    }
}
于 2013-01-30T00:49:12.233 回答