2013-05-10 4 views
41

Io uso Google C++ Testing Framework per il test dell'unità del mio codice. Io uso Eclipse CDT with C++ Unit testing module per l'analisi dell'output.Come inviare messaggi personalizzati in Google C++ Testing Framework?

In precedenza ho usato CppUnit ha le macro familiari CPPUNIT*_MESSAGE che potrebbe essere chiamato in questo modo:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE) 

e permette di inviare messaggi personalizzati per testare l'uscita.

C'è un modo per includere del testo personalizzato nell'output di test di google?

(preferibilmente il modo in cui potrebbe includere un messaggio di dati che viene letto da programmi esistenti per unit testing automatizzato usando Google prova.)

risposta

75

Le macro GTEST restituire un flusso per l'emissione di messaggi di diagnostica quando un test fallisce.

EXPECT_TRUE(false) << "diagnostic message"; 
+4

essere bello includere il testo anche se un test ha esito positivo .... –

+0

@ErikAronesty Avete dato un'occhiata alla fonte per vedere se c'è un modo facile di interfacciarsi con quei dati? –

37

Non c'è modo di farlo in modo pulito nella versione corrente di gtest. Ho esaminato il codice e l'unico output di testo (racchiuso in gtest "Messaggi") viene visualizzato se si verifica un test fallito.

Tuttavia, ad un certo punto, gtest avvia printf 'sullo schermo e puoi sfruttare il livello superiore per ottenere colori indipendenti dalla piattaforma.

Ecco una macro compromessa per fare ciò che vuoi. Utilizza la colorazione del testo interno gtest. Ovviamente lo spazio dei nomi internal:: dovrebbe essere disattivato, ma hey, funziona.

Usage:

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

    // or C++ style 

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

uscita:

Example output

Codice:

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

Grazie, questa è la soluzione corretta, IMHO. Ma posso suggerire di aggiungere un '\ n' nel PRINTF all'interno della classe? questo perché non possiamo unire le linee con TEST_COUT come facciamo con 'std :: cout', quindi è inutile lasciare che l'utente aggiunga il suo' \ n'. Grazie lo stesso! – HappyCactus

2

Si dovrebbe definire il seguito:

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

} logout; 

utilizza questo:

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

riferimento alla risposta di Mark Lakata, qui è il mio modo:

Step1: creare un file di intestazione, ad esempio: gtest_cout.h

Codice:

#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_ */ 

Step2: utilizzare GOUT nella vostra GTEST

Usage:

#include "gtest_cout.h" 

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

C'è una via abbastanza semplice e hacky per farlo (senza bisogno di immersioni in classi interne o la creazione di nuove classi personalizzate) .

Basta definire una macro:

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

e utilizzare GTEST_COUT (proprio come cout) nei test:

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

E vedrai questo risultato:

enter image description here

Il credito va a @Martin Nowak per la sua scoperta.