113 votes

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

J'utilise Cadre de test C++ de Google pour les tests unitaires de mon code. J'utilise Eclipse CDT avec module de test unitaire C++ pour l'analyse des résultats.

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

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

Et permet d'envoyer des messages personnalisés à la sortie de test.

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

(De préférence la manière qui pourrait inclure le message aux données qui sont lues par les programmes existants pour les tests unitaires automatisés en utilisant google test).

208voto

user2093113 Points 2960

Les macros gtest renvoient un flux pour la sortie de messages de diagnostic lorsqu'un test échoue.

EXPECT_TRUE(false) << "diagnostic message";

66voto

Mark Lakata Points 3458

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 texte (enveloppée dans les "Messages" de gtest) est affichée si vous échouer un test.

Cependant, à un certain moment, gtest démarre printf Vous pouvez tirer parti du niveau supérieur pour obtenir des couleurs indépendantes de la plate-forme.

Voici une macro pirate pour faire ce que vous voulez. Elle utilise la coloration interne du texte de gtest. Bien sûr, le internal:: devrait faire sonner les cloches d'alarme, mais bon, ça marche.

Utilisation :

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

  // or C++ style

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

Salida:

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

32voto

Just Shadow Points 2077

Il existe un assez simple et la façon de le faire (sans avoir besoin de de plonger dans les classes internes ou de créer de nouvelles classes personnalisées).

Il suffit de définir une macro :

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

et utiliser GTEST_COUT (tout comme cout ) dans vos tests :

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

Et vous verrez le résultat :

enter image description here

Le mérite revient à Martin Nowak pour ses conclusions.

11voto

Vlad Points 41

De la Sujets avancés sur le googletest vous pouvez utiliser quelques macros à cet effet.

  • SUCCEED() SUCCEED() << "success/info message"; SUCCEED() ne fait que sortir votre message et continue. Il ne marque pas le test comme réussi. Son résultat sera déterminé par les assertions suivantes.
  • FAIL() FAIL() << "test failure message"; FAIL() marque votre test comme ayant échoué, affiche votre message et retourne ensuite de la fonction. Par conséquent, elle ne peut être utilisée que dans les fonctions retournant void.
  • ADD_FAILURE() ADD_FAILURE() << "test failure message"; ADD_FAILURE() marque votre test comme ayant échoué et affiche votre message. Elle ne retourne pas la fonction appelante et le flux d'exécution continue comme avec la série de macros EXPECT_.

5voto

yosolin Points 69

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

Étape 1 : créer 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 : utiliser GOUT dans votre gtest

Utilisation :

#include "gtest_cout.h"

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X