J'utilise le framework de test googletest C++ . Normalement, la sortie textuelle de l'exécution d'un test ressemble à ceci:
[RUN] MyTest.Fuzz [OK] MyTest.Fuzz (1867 ms)
Je voudrais sortir des données supplémentaires dans le même format, par exemple:
[RUN] MyTest.Fuzz [] Graine aléatoire = 1319760587 [OK] MyTest.Fuzz (1867 ms)
J'ai trouvé Journalisation des informations supplémentaires dans la documentation la plus complète, mais cela ne semble envoyer que des données structurées à la sortie XML, pas à la sortie de la console standard.
Existe-t-il une fonction googletest que je peux appeler dans mon test unitaire qui génère du texte dans ce format? Envoyer manuellement des données à cout
fonctionne, mais cela n'inclut pas la sortie colorée habituelle. Je dois donc explicitement indenter la sortie en imprimant 13 espaces ou autre.
Imprimer simplement sur stderr fonctionnera dans la configuration de test par défaut.
std::cerr << "[ ] random seed = " << random_seed << std::endl;
Vous pouvez écrire un wrapper pour l'imprimante par défaut PrettyUnitTestResultPrinter
afin d'imprimer également les propriétés de test. Vous pouvez obtenir l’imprimante par défaut avec listeners.default_result_printer()
(voir ci-dessous). Vous devez implémenter EmptyTestEventListener
et changer la méthode PrettyUnitTestResultPrinter::OnTestEnd()
( dans gtest.cc ) et utiliser les propriétés de résultat: test_info.result()->GetTestProperty(i)
comme l’imprimante pour la sortie XML:
String XmlUnitTestResultPrinter::TestPropertiesAsXmlAttributes(
const TestResult& result) {
Message attributes;
for (int i = 0; i < result.test_property_count(); ++i) {
const TestProperty& property = result.GetTestProperty(i);
attributes << " " << property.key() << "="
<< "\"" << EscapeXmlAttribute(property.value()) << "\"";
}
return attributes.GetString();
}
Ensuite, vous pouvez remplacer le programme d'écoute par défaut pour vos tests, comme cela se fait dans le google test sample :
UnitTest& unit_test = *UnitTest::GetInstance();
if (terse_output) {
TestEventListeners& listeners = unit_test.listeners();
delete listeners.Release(listeners.default_result_printer());
listeners.Append(new TersePrinter);
}
int ret_val = RUN_ALL_TESTS();
Je viens d'utiliser std::cout
avec les codes de couleur ansi dans linux mais je pense que les codes fonctionnent dans Windows depuis le gain de la mise à jour 10ème anniversaire.
std:cout << "\033[0;32m" << "[ ] " << "\033[0;0m"
<< "random seed = " << random_seed << lend;
ou simplement créer un fichier d’en-tête et quelques instructions #define
et l’inclure dans mes tests. J'aime aussi formater le texte pour qu'il en ressorte un peu plus.
#define ANSI_TXT_GRN "\033[0;32m"
#define ANSI_TXT_MGT "\033[0;35m" //Magenta
#define ANSI_TXT_DFT "\033[0;0m" //Console default
#define GTEST_BOX "[ cout ] "
#define COUT_GTEST ANSI_TXT_GRN << GTEST_BOX //You could add the Default
#define COUT_GTEST_MGT COUT_GTEST << ANSI_TXT_MGT
Donc, mon code serait:
cout << COUT_GTEST_MGT << "random seed = " << random_seed << ANSI_TXT_DFT << endl;
Non, fouillez dans les en-têtes et rien ne vous empêche d'ajouter vos propres journaux au milieu. Peut-être quelque chose à demander. Vous pouvez enregistrer une tâche d'amélioration si vous voulez à http://code.google.com/p/googletest/issues/list
Prends soin.