Подтвердить что ты не робот

Как отправить пользовательское сообщение в Google С++ Testing Framework?

Я использую Google С++ Testing Framework для модульного тестирования моего кода. Я использую Eclipse CDT с модулем тестирования модулей С++ для анализа вывода.

Раньше я использовал CppUnit, у него есть семейство макросов CPPUNIT * _MESSAGE, которое можно было бы назвать так:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

И позволяет отправлять пользовательские сообщения для тестирования вывода.

Есть ли способ включить какой-либо пользовательский текст в выходной файл google?

(Предпочтительно способ, который может включать в себя сообщение для данных, которое считывается существующими программами для автоматического тестирования модулей с помощью теста Google).

4b9b3361

Ответ 1

gtest macros возвращают поток для вывода диагностических сообщений, когда тест терпит неудачу.

EXPECT_TRUE(false) << "diagnostic message";

Ответ 2

Нет способа сделать это чисто в текущей версии gtest. Я просмотрел код, и только если вы завершили тест, будет показан только вывод текста (завернутый в gtest "Messages" ).

Однако в какой-то момент gtest запускает printf на экран, и вы можете использовать уровень выше этого, чтобы получить цвета, независимые от платформы.

Здесь взломанный макрос, чтобы делать то, что вы хотите. Это использует самую горячую внутреннюю окраску текста. Конечно, пространство имен internal:: должно звучать с предупреждающих колоколов, но эй, оно работает.

Использование:

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

  // or C++ style

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

Вывод:

Example output

код:

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

Вы должны определить ниже:

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

} logout;

используя это:

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

Ответ 4

Обратите внимание на ответ Марка Лаката, вот мой способ:

Шаг 1: создайте файл заголовка, например: gtest_cout.h

код:

#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_ */

Шаг 2: используйте GOUT в своем gtest

Использование:

#include "gtest_cout.h"

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