我知道Java的单元测试非常简单。我们只需要使用JUnit并运行测试类作为JUnit测试。
现在我正在使用C ++,我找到了一个测试库:cppunit。
似乎我需要使用特定函数main
运行我的测试。
但是,cpp
项目只能有一个main
。
我该怎么办?我在进行测试和运行项目时必须切换主电源?
答案 0 :(得分:7)
我该怎么办?我在进行测试和运行项目时必须切换主电源?
您应该将要测试的代码分成一个库项目,该项目可以从目标应用程序和单元测试运行器链接。
然后又有两个提供main()
功能的项目:
main()
实现转发给MyTargetApp
类成员函数的调用,例如MyTargetApp::run()
TestRunner
,并包含所有测试套件和夹具类(包括MyTargetApp
的这些类。)可以配置目标应用程序项目,而无需链接到cppunit库和测试套件/ fixture实现(这肯定会减少最终的工件占用空间)。
但是,cpp项目只能有一个
main
。
另一种选择是只使用一个具有窄main()
函数的项目,该函数可以使用条件预处理器语句进行编译(来自TestRunner
class上的示例):
#ifdef TESTING
int runUnitTests(int argc, char* argv[]);
#endif
int main(int argc, char* argv[]) {
#ifdef TESTING
// run the unit tests
// -----------------------------------------------------------------
return runUnitTests(argc,argv);
#else
// run the application
// -----------------------------------------------------------------
MyTargetApp app;
return app.run(argc,argv);
#endif
#ifdef TESTING
int runUnitTests(int argc, char* argv[]) {
std::string testPath = (argc > 1) ? std::string(argv[1]) : "";
// Create the event manager and test controller
CppUnit::TestResult controller;
// Add a listener that colllects test result
CppUnit::TestResultCollector result;
controller.addListener( &result );
// Add a listener that print dots as test run.
CppUnit::TextTestProgressListener progress;
controller.addListener( &progress );
// Add the top suite to the test runner
CppUnit::TestRunner runner;
runner.addTest( CppUnit::TestFactoryRegistry::getRegistry().makeTest() );
try {
std::cout << "Running " << testPath;
runner.run( controller, testPath );
std::cerr << std::endl;
// Print test in a compiler compatible format.
CppUnit::CompilerOutputter outputter( &result, std::cerr );
outputter.write();
}
catch ( std::invalid_argument &e ) {
// Test path not resolved
std::cerr << std::endl
<< "ERROR: " << e.what()
<< std::endl;
return 0;
}
return result.wasSuccessful() ? 0 : 1;
}
#endif
然后有2个不同的项目配置,一个定义TESTING
,另一个没定。
此解决方案的一个缺点是,您将获得程序中剩余的所有单元测试套件和装置,因为cppunit宏将自动注册并实例化它们,无论是否将从执行路径调用它们。