How to send custom message in Google C++ Testing F

2019-03-07 20:54发布

问题:

I use Google C++ Testing Framework for unit testing of my code. I use Eclipse CDT with C++ Unit testing module for output analysis.

Previously I used CppUnit it has macros family CPPUNIT*_MESSAGE that could be called like this:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

And allows to send custom messages to test output.

Is there a way to include some custom text in google test output?

(Preferably the way that could include message to data that is read by existing programs for automated unit testing using google test.)

回答1:

The gtest macros return a stream for outputting diagnostic messages when a test fails.

EXPECT_TRUE(false) << "diagnostic message";


回答2:

There is no way of doing it cleanly in the current version of gtest. I looked at the code, and the only text output (wrapped in gtest "Messages") is shown if you fail a test.

However, at some point, gtest starts printf'ing to the screen, and you can leverage the level above that to get colors that are platform independent.

Here's a hacked macro to do what you want. This uses the gtest internal text coloring. Of course the internal:: namespace should be sounding off warning bells, but hey, it works.

Usage:

TEST(pa_acq,Foo)
{
  // C style
  PRINTF("Hello world \n");

  // or C++ style

  TEST_COUT << "Hello world" << std::endl;
}

Output:

Code:

namespace testing
{
 namespace internal
 {
  enum GTestColor {
      COLOR_DEFAULT,
      COLOR_RED,
      COLOR_GREEN,
      COLOR_YELLOW
  };

  extern void ColoredPrintf(GTestColor color, const char* fmt, ...);
 }
}
#define PRINTF(...)  do { testing::internal::ColoredPrintf(testing::internal::COLOR_GREEN, "[          ] "); testing::internal::ColoredPrintf(testing::internal::COLOR_YELLOW, __VA_ARGS__); } while(0)

// C++ stream interface
class TestCout : public std::stringstream
{
public:
    ~TestCout()
    {
        PRINTF("%s",str().c_str());
    }
};

#define TEST_COUT  TestCout()


回答3:

There is a quite simple and hacky way for doing it (without need of diving into internal classes or creating new custom classes).

Just define a macro:

#define GTEST_COUT std::cerr << "[          ] [ INFO ]"

and use GTEST_COUT (just like cout ) in your tests :

GTEST_COUT << "Hello World" << std::endl;

And you'll see such result:

Credit goes to @Martin Nowak for his finding.



回答4:

You should define the below:

static class LOGOUT {
public:
    LOGOUT() {}
    std::ostream&  info() {
        std::cout << "[info      ] ";
        return std::cout;
    }

} logout;

using this:

logout.info() << "test: " << "log" << std::endl;


回答5:

Refer to Mark Lakata's answer, here is my way:

Step1: create a header file, for example: gtest_cout.h

Code:

#ifndef _GTEST_COUT_H_
#define _GTEST_COUT_H_

#include "gtest/gtest.h"

namespace testing
{
namespace internal
{
enum GTestColor
{
    COLOR_DEFAULT, COLOR_RED, COLOR_GREEN, COLOR_YELLOW
};
extern void ColoredPrintf(GTestColor color, const char* fmt, ...);
}
}

#define GOUT(STREAM) \
    do \
    { \
        std::stringstream ss; \
        ss << STREAM << std::endl; \
        testing::internal::ColoredPrintf(testing::internal::COLOR_GREEN, "[          ] "); \
        testing::internal::ColoredPrintf(testing::internal::COLOR_YELLOW, ss.str().c_str()); \
    } while (false); \

#endif /* _GTEST_COUT_H_ */

Step2: use GOUT in your gtest

Usage:

#include "gtest_cout.h"

TEST(xxx, yyy)
{
    GOUT("Hello world!");
}