Як надіслати власне повідомлення в Google C ++ Testing Framework?


83

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

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

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

І дозволяє надсилати власні повідомлення для перевірки виводу.

Чи є спосіб включити якийсь власний текст до результатів тесту Google?

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

Відповіді:


160

Макроси gtest повертають потік для виведення діагностичних повідомлень, коли тест не вдається.

EXPECT_TRUE(false) << "diagnostic message";

@ErikAronesty Чи зазирнули ви у джерело, чи існує простий спосіб взаємодії з цими даними?
kayleeFrye_onDeck

2
Якщо вам потрібно надрукувати текст незалежно від результату, просто напишіть його в stdout. Але зазвичай це призводить до дуже галасливих тестів, з якими важко працювати.
Аудріус Мескаускас,

FAIL () << "діагностичне повідомлення"; працює так само, але зменшує генерований результат на кілька рядків, оскільки не повідомляє вам про фактичне значення, очікуване значення тощо, що робить для всіх макросів EXPECT_X (). Про всяк випадок, якщо ви хочете трохи зменшити довжину виводу.
BallisticTomato

61

У поточній версії gtest це неможливо зробити чисто. Я подивився код, і виводиться лише текст (загорнутий у gtest "Повідомлення"), якщо ви не пройшли тест.

Однак у певний момент gtest починає виходити printfна екран, і ви можете використовувати рівень вище, щоб отримати кольори, незалежні від платформи.

Ось зламаний макрос, щоб робити те, що ти хочеш. Тут використовується найвища внутрішня розмальовка тексту. Звичайно, internal::простір імен повинен звучати попереджувальними дзвінками, але привіт, це працює.

Використання:

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

  // or C++ style

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

Вихід:

Приклад виводу

Код:

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()

Дякую, це правильне рішення, ІМХО. Але чи можу я запропонувати додати a\n до PRINTF всередині класу? це тому, що ми не можемо приєднувати рядки з TEST_COUT, як це робимо std::cout, тому марно дозволяти користувачеві додавати свої \n. В будь-якому випадку, дякую Вам!
HappyCactus

1
На жаль, цей підхід більше не працює з сучасними версіями Google Test - testing::internal::ColoredPrintf більше не доступний для громадськості :(
AntonK

17

Існує досить простий і шалений спосіб зробити це (без необхідності занурюватися у внутрішні класи або створювати нові власні класи).

Просто визначте макрос:

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

і використовуйте GTEST_COUT(так само, як cout) у своїх тестах:

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

І ви побачите такий результат:

введіть тут опис зображення

За його знахідку заслуга йде @Martin Nowak .


5

Зверніться до відповіді Марка Лакати, ось мій шлях:

Крок 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!");
}

ColoredPrintf був зроблений статичним в останній версії, тому цей хак більше не працюватиме.
schwart

3

Ви повинні визначити нижче:

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

} logout;

використовуючи це:

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

0

У Розширених темах Googletest ви можете використовувати для цього кілька макросів.

  • SUCCEED () SUCCEED() << "success/info message"; SUCCEED () лише видає ваше повідомлення та продовжує. Це не означає тестування як пройдене. Його результат буде визначений наступними твердженнями.
  • FAIL () FAIL() << "test failure message"; FAIL () позначає ваш тест як невдалий, видає ваше повідомлення, а потім повертається з функції. Тому може використовуватися лише у функціях, що повертають void.
  • ADD_FAILURE () ADD_FAILURE() << "test failure message"; ADD_FAILURE () позначає ваш тест як невдалий та виводить ваше повідомлення. Він не повертається із функції виклику, і потік виконання продовжується, як із серією макросів EXPECT_.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.