C++ 减少gtest的输出,使其看起来类似于cxxtest的输出

C++ 减少gtest的输出,使其看起来类似于cxxtest的输出,c++,googletest,C++,Googletest,我有一组使用gtest作为框架的单元测试 生成并执行,输出如下所示: 我希望输出与使用cxxunit时的输出类似(测试通过时,详细说明失败时的错误)。如果可能的话,用颜色 如何做到这一点 如果我不清楚,我正在寻找代码和确切的方法如何做到这一点 输出应该类似于: Executing dummy_tests ..... ../code/app/unit_tests/unittest_dummy.cpp:25: Failure Value of: 2 Expected: 1 .. FAILED

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

生成并执行,输出如下所示:

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

如何做到这一点


如果我不清楚,我正在寻找代码和确切的方法如何做到这一点


输出应该类似于:

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

我正在尝试使用和创建自定义侦听器。但是这个例子没有彩色的输出,它将大量的消息打印到输出中

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

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

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

您提到的文档页面有一个到的链接,可以回答您的问题。您可以通过以下方式在
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());
  }
}
ColoredPrintf()
在外部不可用;您可以将其代码复制到您的项目中。

链接到该示例将提供更多信息和我缺少的一些信息。 帮助我获得种子价值

标题看起来像:

#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;
    }
}
#包括“unittests\u cxlistener.hpp”
#包括
命名空间测试{
命名空间内部
{
枚举GTESTCLOR
{
颜色默认值,
红色,
绿色,
黄色
};
void ColoredPrintf(GTestColor color,const char*fmt,…);
}
}
使用名称空间测试::内部;
void CxxTestPrinter::OnTestProgramStart(常量::测试::单元测试和单元测试)
{
标准::cout
#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;
    }
}