与this question密切相关,我希望能够根据命令行参数选择要在CppUnit程序集中执行的测试。考虑--exclude=integration,smoke,x64only
或--include=unit
。 NUnit Categories就像这样工作。 如何在CppUnit中实现类似的功能?
我尝试使用方法IHasCategories
添加抽象基类get_Categories()
的路径,并且我的测试装置覆盖了返回以逗号分隔的类别列表的方法。但是,当我们通过CppUnit::Test *topLevelTest = CppUnit::TestFactoryRegistry::getRegistry().makeTest();
之类的调用从CppUnit检索测试时,我们得到CppUnit::Test
的实例。 我真正需要的是CppUnit::TestFixture
的一个实例来获取我要检查的类别列表。
答案 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);
}
}