2013-05-10 5 views
41

Ich verwende Google C++ Testing Framework für Unit-Tests meines Codes. Ich verwende Eclipse CDT with C++ Unit testing module für die Ausgabeanalyse.Wie kann ich eine benutzerdefinierte Nachricht in Google C++ Testing Framework senden?

Früher verwendete ich CppUnit es Makros Familie CPPUNIT*_MESSAGE hat, die so genannt werden könnte:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE) 

und ermöglicht die Ausgabe zu testen, individuelle Nachrichten zu senden.

Gibt es eine Möglichkeit, einige benutzerdefinierte Text in Google Test-Ausgabe enthalten?

(Vorzugsweise ist die Art und Weise, die Nachricht an Daten enthalten könnte, die durch die bestehenden Programme zum automatisierten Unit-Tests mit Google Test gelesen wird.)

Antwort

75

Die Gtest Makros geben einen Strom zur Ausgabe von Diagnosemeldungen, wenn ein Test fehlschlägt.

+4

sei nett, Text einzuschließen, selbst wenn ein Test erfolgreich ist .... –

+0

@ErikAronesty Hast du einen Blick in die Quelle geworfen, um zu sehen, ob es eine einfache Möglichkeit gibt, mit diesen Daten zu kommunizieren? –

37

Es gibt keine Möglichkeit, es in der aktuellen Version von gtest sauber zu machen. Ich schaute auf den Code, und die einzige Textausgabe (verpackt in gtest "Nachrichten") wird angezeigt, wenn Sie einen Test fehlschlagen.

Irgendwann jedoch startet gtest printf auf dem Bildschirm, und Sie können die Ebene darüber nutzen, um Farben zu erhalten, die plattformunabhängig sind.

Hier ist ein gehackter Makro, um zu tun, was Sie wollen. Dies verwendet die interne Textfarbe gtest. Natürlich sollte der Namespace internal:: Alarmsignale auslassen, aber hey, es funktioniert.

Verbrauch:

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

    // or C++ style 

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

Ausgang:

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

Danke, das ist die richtige Lösung, IMHO. Aber kann ich vorschlagen, ein '\ n' im PRINTF in der Klasse hinzuzufügen? Das liegt daran, dass wir keine Zeilen mit TEST_COUT verknüpfen können, wie wir es mit 'std :: cout' tun, so dass es sinnlos ist, den Benutzer sein' \ n' hinzufügen zu lassen. Trotzdem danke! – HappyCactus

2

Sie die unten definieren sollte:

static class LOGOUT { 
public: 
    LOGOUT() {} 
    std::ostream& info() { 
     std::cout << "[info  ] "; 
     return std::cout; 
    } 

} logout; 

mit dieser:

logout.info() << "test: " << "log" << std::endl; 
0

Mark Lakata Antwort Siehe, hier ist meine Art und Weise:

Schritt 1: eine Header-Datei erstellen, 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 Gtest

Verbrauch:

#include "gtest_cout.h" 

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

Es gibt eine ganz einfach und Hacky Art und Weise, es zu tun (ohne Notwendigkeit des Tauchens in interne Klassen oder das Erstellen von neuen benutzerdefinierten Klassen) .

Definieren Sie ein Makro:

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

und verwenden GTEST_COUT (wie cout) in Ihren Tests:

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

Und Sie werden ein solches Ergebnis sehen:

enter image description here

Kredit geht an @Martin Nowak für sein Finden.