unit test primer juego google color c++ googletest

primer - ¿Cómo enviar un mensaje personalizado en Google C++ Testing Framework?



google test juego (5)

Debes definir lo siguiente:

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

usando esto:

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

Utilizo Google C ++ Testing Framework para la prueba unitaria de mi código. Uso Eclipse CDT con el módulo de prueba de la unidad C ++ para el análisis de salida.

Anteriormente usé CppUnit , tiene una familia de macros CPPUNIT*_MESSAGE que podría llamarse así:

CPPUNIT_ASSERT_EQUAL_MESSAGE("message",EXPECTED_VALUE,ACTUAL_VALUE)

Y permite enviar mensajes personalizados para probar la salida.

¿Hay alguna forma de incluir texto personalizado en la salida de Google Test?

(Preferiblemente, la forma en que podría incluir el mensaje a los datos que leen los programas existentes para realizar pruebas unitarias automatizadas utilizando Google Test).


Hay una forma bastante simple y complicada de hacerlo (sin necesidad de sumergirse en clases internas o crear nuevas clases personalizadas).

Solo define una macro:

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

y usa GTEST_COUT (como cout ) en tus pruebas:

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

Y verás tal resultado:

El crédito es para @Martin Nowak por su descubrimiento.


Las macros gtest devuelven un flujo para enviar mensajes de diagnóstico cuando falla una prueba.

EXPECT_TRUE(false) << "diagnostic message";


No hay forma de hacerlo limpiamente en la versión actual de gtest. Miré el código y, si no pasa una prueba, se muestra el único resultado de texto (incluido en "Mensajes").

Sin embargo, en algún momento, gtest comienza a imprimir en la pantalla y puede aprovechar el nivel superior para obtener colores independientes de la plataforma.

Aquí hay una macro pirateada para hacer lo que quieras. Esto utiliza el colorante de texto interno gtest. Por supuesto, el internal:: espacio de nombres internal:: debe estar haciendo sonar las campanas de advertencia, pero bueno, funciona.

Uso:

TEST(pa_acq,Foo) { // C style PRINTF("Hello world /n"); // or C++ style TEST_COUT << "Hello world" << std::endl; }

Salida:

Código:

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


Refiérase a la respuesta de Mark Lakata, aquí está mi camino:

Paso 1: crea un archivo de encabezado, por ejemplo: gtest_cout.h

Código:

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

Paso 2: usa GOUT en tu gtest

Uso:

#include "gtest_cout.h" TEST(xxx, yyy) { GOUT("Hello world!"); }