我正在使用 CppUnit 设置一堆单元测试,但遇到的问题是没有一个测试正在运行。该项目分为几个小库,我计划以相同的方式划分单元测试类,然后将它们全部链接到一个单独的测试程序中。问题是,然后测试类在他们自己的库中,除非我明确调用它们,否则它们不会链接到主测试程序中,即我必须放入
runner.addTest( TestClass::suite() );
单独为每个测试类,不能使用 TestFactoryRegistry 的 makeTests() 方法来获取测试列表。如果我只是在顶层目录中将它们全部编译在一起,那么 makeTests() 方法可以正常工作,但如果我能提供帮助,我不想将所有测试类放在一个位置。
CppUnit 文档给出了以下小提示
使用 Helper 宏时的链接问题?
当您创建一个项目并编写它的单元测试套件时,通过使用所谓的帮助宏使工作变得更容易:CPPUNIT_TEST_SUITE_NAMED_REGISTRATION、CPPUNIT_REGISTRY_ADD 和 CPPUNIT_REGISTRY_ADD_TO_DEFAULT。问题是,如果您在 TestFixture 类的源代码文件中使用这些宏(例如 MyTest),并且如果您使用这样的一行
runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest()
);
在 main.cpp 文件中的 main() 函数中,根本不会有测试运行!
原因很简单,如果您的 main.cpp 中没有未定义的符号,则链接阶段(构建过程的步骤之一)不要在最终的可执行文件中插入目标文件(.obj 或 .o 文件)。
这样,包含 AutoRegister 静态变量实例化的目标代码不是最终可执行文件的一部分,并且无法在 main() 函数中将自己插入到运行器中。
您必须在 main.cpp 中创建一个未定义的符号,以便 mytest.o 文件与 main.o 集成到最终的可执行文件中。
米歇尔·诺拉德犯下的诡计
但没有说如何使这项工作,我只是足够密集,无法自己弄清楚或在网上找到一个例子。
现在我可以为每个库单独做一个可执行的测试,最后我可能会这样做,但我想先让它工作,所以我只需要运行一个测试程序来测试整个事情。有关如何使其发挥作用的任何想法/示例?