Hay una manera bastante simple de utilizar un paralelo la salida de googletest para las pruebas de su unidad.
En pocas palabras, puede crear su propia clase de impresora que emita resultados directamente en la ventana de salida de VisualStudio. De esta forma, parece más flexible que otras, ya que puede controlar tanto el contenido del resultado (formato, detalles, etc.) como el destino. Puede hacerlo bien en su función main()
. Puede usar más de una impresora a la vez. Y puede saltar al código haciendo doble clic en el mensaje de error en las pruebas fallidas.
Estos son los pasos para hacerlo:
- crear una clase derivada de la clase
::testing::EmptyTestEventListener
.
- Anular las funciones necesarias. Utilice la función
OutputDebugString()
en lugar de printf()
.
- Antes de
RUN_ALL_TESTS()
llamar, crea una instancia de la clase y vincúlala a la lista de oyentes de gtest.
Su clase de impresora puede ser similar al siguiente:
// Provides alternative output mode which produces minimal amount of
// information about tests.
class TersePrinter : public EmptyTestEventListener {
void outDebugStringA (const char *format, ...)
{
va_list args;
va_start(args, format);
int len = _vscprintf(format, args) + 1;
char *str = new char[len * sizeof(char)];
vsprintf(str, format, args);
OutputDebugStringA(str);
delete [] str;
}
// Called after all test activities have ended.
virtual void OnTestProgramEnd(const UnitTest& unit_test) {
outDebugStringA("TEST %s\n", unit_test.Passed() ? "PASSED" : "FAILED");
}
// Called before a test starts.
virtual void OnTestStart(const TestInfo& test_info) {
outDebugStringA(
"*** Test %s.%s starting.\n",
test_info.test_case_name(),
test_info.name());
}
// Called after a failed assertion or a SUCCEED() invocation.
virtual void OnTestPartResult(const TestPartResult& test_part_result) {
outDebugStringA(
"%s in %s:%d\n%s\n",
test_part_result.failed() ? "*** Failure" : "Success",
test_part_result.file_name(),
test_part_result.line_number(),
test_part_result.summary());
}
// Called after a test ends.
virtual void OnTestEnd(const TestInfo& test_info) {
outDebugStringA(
"*** Test %s.%s ending.\n",
test_info.test_case_name(),
test_info.name());
}
}; // class TersePrinter
La vinculación de la impresora a la lista de oyentes:
UnitTest& unit_test = *UnitTest::GetInstance();
TestEventListeners& listeners = unit_test.listeners();
listeners.Append(new TersePrinter);
El enfoque se describe en el sample #9 de the Googletest samples.
Una nota sobre cómo ir a la ruta del evento posterior a la construcción: una prueba fallida hará que la construcción falle. Esto me causó problemas cuando seleccioné las pruebas en un servidor de integración continua (Jenkins) porque Jenkins informaría una compilación fallada en lugar de una prueba fallida. –