加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何像junit一样使用cppunit – 两个主电源

发布时间:2020-12-16 10:01:16 所属栏目:百科 来源:网络整理
导读:我知道 Java的单元测试非常简单.我们只需要使用JUnit并运行测试类作为JUnit测试. 现在我正在使用C,我找到了一个测试库:cppunit. 似乎我需要使用特定的函数main来运行我的测试. 但是,一个cpp项目只能有一个主要项目. 我该怎么办?当我进行测试和运行项目时,
我知道 Java的单元测试非常简单.我们只需要使用JUnit并运行测试类作为JUnit测试.

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

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

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

解决方法

What should I do? I have to switch mains when I do my test and when I run my project?

您应该将代码分开测试到一个库项目,该项目可以从目标应用程序和单元测试运行器链接.

然后还有两个提供main()函数的项目:

>一个用于目标应用程序,它只是将main()实现转发给MyTargetApp类成员函数的调用,例如MyTargetApp ::的run()
>一个用于单元测试,调用TestRunner,并包含所有测试套件和fixture类(包括MyTargetApp的这些类).

可以配置目标应用程序项目,而无需链接到cppunit库和测试套件/ fixture实现(这肯定会减少最终的工件占用空间).

However,a cpp project can have ONLY ONE 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宏将自动注册并实例化它们,无论是否将从执行路径调用它们.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读