【问题标题】:Reducing output of gtest, to look similar to output of cxxtest减少 gtest 的输出,看起来类似于 cxxtest 的输出
【发布时间】:2014-02-04 13:19:49
【问题描述】:

我有一组使用 gtest 作为框架的单元测试。

构建并执行,输出如下所示:

我希望输出类似于使用 cxxunit 时的输出(测试通过时.,失败时详细错误)。如果可能的话,用颜色。

如何做到这一点?


如果我不清楚,我正在寻找代码和确切的方法。


输出应该是这样的:

Executing dummy_tests .....
../code/app/unit_tests/unittest_dummy.cpp:25: Failure
Value of: 2
Expected: 1
..
FAILED

我正在尝试使用 this example 并创建自定义侦听器。但是该示例没有彩色输出,并且会在输出中打印大量消息。

对于彩色输出,开发者实现了ColoredPrintf()函数。

至于我面临的特殊问题是缺乏文档:

  • 如何在程序启动时获取有关整个测试套件的信息? (我猜是OnTestProgramStart() 方法)
  • 如何获取有关测试是否失败的信息? (OnTestProgramEnd()? 还是其他方式?)

【问题讨论】:

    标签: c++ googletest


    【解决方案1】:

    您提到的文档页面有一个指向sample code 的链接,可以回答您的问题。您可以通过这种方式在OnTestProgramStart() 或更高版本中枚举测试用例和测试:

    UnitTest& unit_test = *UnitTest::GetInstance();
    for (int i = 0; i < unit_test.total_test_case_count(); ++i) {
      const TestCase& test_case = *unit_test.GetTestCase(i);
      for (int j = 0; j < test_case.total_test_count(); ++j) {
        const TestInfo& test_info = *test_case.GetTestInfo(j);
        fprintf(stdout, "%s.%s\n", test_case.name().c_str(),
                test_info.name().c_str());
      }
    }
    

    测试状态的信息确实可以在OnTestProgramEnd()收集到:

    virtual void OnTestProgramEnd(const UnitTest& unit_test) {
      fprintf(stdout, "TEST %s\n", unit_test.Passed() ? "PASSED" : "FAILED");
      fflush(stdout);
    }
    

    ColoredPrintf() 外部不可用;您可以将其代码复制到您的项目中。

    【讨论】:

      【解决方案2】:

      This answer 链接到该示例将提供更多信息以及我缺少的一些信息。 This answer帮我拿到了种子值。

      标题看起来像:

      #ifndef UNITTESTS_CXXLISTENER_HPP
      #define UNITTESTS_CXXLISTENER_HPP
      
      #include "gtest/gtest.h"
      
      class CxxTestPrinter : public ::testing::EmptyTestEventListener
      {
      
          virtual void OnTestProgramStart( const ::testing::UnitTest& unit_test );
          virtual void OnTestIterationStart( const ::testing::UnitTest& unit_test, int iteration );
          virtual void OnTestPartResult( const ::testing::TestPartResult& test_part_result );
          virtual void OnTestEnd( const ::testing::TestInfo& test_info );
          virtual void OnTestIterationEnd( const ::testing::UnitTest& unit_test, int );
          virtual void OnTestProgramEnd( const ::testing::UnitTest& unit_test );
      };
      
      #endif
      

      还有源文件:

      #include "unittests_cxxlistener.hpp"
      
      #include <iostream>
      
      namespace testing {
      namespace internal
      {
      
      enum GTestColor
      {
        COLOR_DEFAULT,
        COLOR_RED,
        COLOR_GREEN,
        COLOR_YELLOW
      };
      void ColoredPrintf(GTestColor color, const char* fmt, ...);
      
      }
      }
      
      using namespace testing::internal;
      
      void CxxTestPrinter::OnTestProgramStart( const ::testing::UnitTest& unit_test )
      {
          std::cout << "Executing unit tests in " << unit_test.original_working_dir() << std::endl;
      }
      
      void CxxTestPrinter::OnTestIterationStart( const ::testing::UnitTest& , int iteration )
      {
          std:: cout << "Executing unit tests iteration " << iteration << " : ";
      }
      
      void CxxTestPrinter::OnTestPartResult( const ::testing::TestPartResult& test_part_result )
      {
          if ( test_part_result.failed() )
          {
              std::cout << "\n\nFailure in " << test_part_result.file_name() << " : line "  << test_part_result.line_number() << std::endl
                        << test_part_result.summary() << std::endl << std::endl;
          }
      }
      
      void CxxTestPrinter::OnTestEnd( const ::testing::TestInfo& test_info )
      {
          if ( test_info.result()->Passed() )
          {
              ColoredPrintf( COLOR_GREEN, "." );
          }
      }
      
      void CxxTestPrinter::OnTestIterationEnd(const ::testing::UnitTest& unit_test, int )
      {
          if ( unit_test.Passed() )
          {
              ColoredPrintf( COLOR_GREEN, "       OK\n" );
          }
          else
          {
              ColoredPrintf( COLOR_RED, "       FAILED\n" );
          }
      }
      
      void CxxTestPrinter::OnTestProgramEnd( const ::testing::UnitTest& unit_test )
      {
          if ( unit_test.Failed() )
          {
              std::cout << "Some unit tests failed. test_random_seed = 0x" << std::hex << unit_test.random_seed() << std::endl;
          }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-08-17
        • 2019-04-18
        • 1970-01-01
        • 2013-10-27
        • 1970-01-01
        • 1970-01-01
        • 2020-01-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多