web-dev-qa-db-fra.com

Comment envoyer un message personnalisé dans Google C ++ Testing Framework?

J'utilise Google C++ Testing Framework pour les tests unitaires de mon code. J'utilise Eclipse CDT avec module de test d'unité C++ pour l'analyse de sortie.

Auparavant, j'utilisais CppUnit il a une famille de macros CPPUNIT * _MESSAGE qui pourrait être appelé comme ceci:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

Et permet d'envoyer des messages personnalisés pour tester la sortie.

Existe-t-il un moyen d'inclure du texte personnalisé dans la sortie de test Google?

(De préférence, la manière qui pourrait inclure un message aux données qui est lu par des programmes existants pour des tests unitaires automatisés à l'aide de google test.)

62
Yuriy Petrovskiy

Les macros gtest renvoient un flux pour générer des messages de diagnostic lorsqu'un test échoue.

EXPECT_TRUE(false) << "diagnostic message";
123
user2093113

Il n'y a aucun moyen de le faire proprement dans la version actuelle de gtest. J'ai regardé le code, et la seule sortie de texte (enveloppée dans gtest "Messages") est affichée si vous échec un test.

Cependant, à un certain point, gtest démarre printf 'à l'écran, et vous pouvez tirer parti du niveau supérieur pour obtenir des couleurs indépendantes de la plate-forme.

Voici une macro piratée pour faire ce que vous voulez. Cela utilise la coloration du texte interne gtest. Bien sûr, le internal:: l'espace de noms devrait sonner, mais bon, ça marche.

Usage:

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

  // or C++ style

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

Sortie:

Example 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()
57
Mark Lakata

Il existe un moyen assez simple et hacky pour le faire (sans avoir besoin de plonger dans les classes internes ou de créer de nouvelles classes personnalisées).

Définissez simplement une macro:

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

et utilise GTEST_COUT (comme cout) dans vos tests:

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

Et vous verrez un tel résultat:

enter image description here

Le crédit revient à @ Martin Nowak pour sa découverte.

8
Just Shadow

Référez-vous à la réponse de Mark Lakata, voici ma façon:

Étape 1: créez un fichier d'en-tête, par exemple: 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_ */

Étape 2: utilisez GOUT dans votre gtest

Usage:

#include "gtest_cout.h"

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

Vous devez définir ce qui suit:

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

} logout;

en utilisant ceci:

logout.info() << "test: " << "log" << std::endl;
2
허영주