如何使用cppunit就像junit ---两个主电源

时间:2016-01-19 17:46:57

标签: c++ cppunit

我知道Java的单元测试非常简单。我们只需要使用JUnit并运行测试类作为JUnit测试。

现在我正在使用C ++,我找到了一个测试库:cppunit。

似乎我需要使用特定函数main运行我的测试。 但是,cpp项目只能有一个main

我该怎么办?我在进行测试和运行项目时必须切换主电源?

1 个答案:

答案 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宏将自动注册并实例化它们,无论是否将从执行路径调用它们。