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.)
Les macros gtest renvoient un flux pour générer des messages de diagnostic lorsqu'un test échoue.
EXPECT_TRUE(false) << "diagnostic message";
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:
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()
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:
Le crédit revient à @ Martin Nowak pour sa découverte.
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!");
}
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;