Ich verwende Google C ++ Testing Framework zum Unit-Testen meines Codes. Ich verwende Eclipse CDT mit C ++ Unit-Testmodul für die Ausgabeanalyse.
Zuvor habe ich CppUnit verwendet. Es hat die Makrofamilie CPPUNIT * _MESSAGE , die folgendermaßen aufgerufen werden kann:
CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)
Und ermöglicht das Senden von benutzerdefinierten Nachrichten zum Testen der Ausgabe.
Gibt es eine Möglichkeit, benutzerdefinierten Text in die Google-Testausgabe aufzunehmen?
(Vorzugsweise die Art und Weise, wie Nachrichten an Daten gesendet werden können, die von vorhandenen Programmen für automatisierte Komponententests mit Google Test gelesen werden.)
c++
googletest
Yuriy Petrovskiy
quelle
quelle
In der aktuellen Version von gtest gibt es keine Möglichkeit, dies sauber zu machen. Ich schaute auf dem Code, und die einzige Textausgabe (eingewickelt in Gtest „Nachrichten“) wird angezeigt , wenn Sie nicht einen Test.
Irgendwann wird gtest jedoch
printf
auf dem Bildschirm angezeigt, und Sie können die darüber liegende Stufe nutzen, um plattformunabhängige Farben zu erhalten.Hier ist ein gehacktes Makro, um zu tun, was Sie wollen. Dies verwendet die gtest-interne Textfarbe. Natürlich sollte der
internal::
Namespace von Warnglocken ausgehen, aber hey, es funktioniert.Verwendung:
TEST(pa_acq,Foo) { // C style PRINTF("Hello world \n"); // or C++ style TEST_COUT << "Hello world" << std::endl; }
Ausgabe:
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()
quelle
\n
innerhalb der Klasse ein PRINTF hinzuzufügen ? Das liegt daran, dass wir mit TEST_COUT keine Zeilen verbinden können, wie wir es tun. Daherstd::cout
ist es sinnlos, den Benutzer seine hinzufügen zu lassen\n
. Trotzdem danke!testing::internal::ColoredPrintf
nicht mehr - ist für die Öffentlichkeit nicht mehr verfügbar :(Es gibt eine recht einfache und hackige Möglichkeit, dies zu tun (ohne in interne Klassen eintauchen oder neue benutzerdefinierte Klassen erstellen zu müssen).
Definieren Sie einfach ein Makro:
#define GTEST_COUT std::cerr << "[ ] [ INFO ]"
und verwenden Sie
GTEST_COUT
(genau wiecout
) in Ihren Tests:GTEST_COUT << "Hello World" << std::endl;
Und Sie werden ein solches Ergebnis sehen:
Dank geht an @Martin Nowak für seine Entdeckung.
quelle
Beziehen Sie sich auf Mark Lakatas Antwort, hier ist mein Weg:
Schritt 1: Erstellen Sie eine Header-Datei, zum Beispiel:
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_ */
Schritt 2: Verwenden Sie
GOUT
in Ihrem gtestVerwendung:
#include "gtest_cout.h" TEST(xxx, yyy) { GOUT("Hello world!"); }
quelle
Sie sollten Folgendes definieren:
static class LOGOUT { public: LOGOUT() {} std::ostream& info() { std::cout << "[info ] "; return std::cout; } } logout;
mit diesem:
logout.info() << "test: " << "log" << std::endl;
quelle