web-dev-qa-db-fra.com

Imprimer une sortie supplémentaire dans Google Test

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.

39
Greg Hewgill

Imprimer simplement sur stderr fonctionnera dans la configuration de test par défaut.

std::cerr << "[          ] random seed = " << random_seed << std::endl;
16
Martin Nowak

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();
11
kossmoboleat

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;
0
Lee

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.

0
Captain Charmi