В инете довольно много вопросов типа "как перенаправить вывод googletest с консоли в окно VS Output" от людей, которые пытаются подружить Visual Studio и googletest. Советы им дают самые разные, например, использовать PostBuildEvent или установить какой-нибудь плагин к Студии.
Хотя на мой взгляд самый удобный (гибкий, масштабируемый, переносимый) способ - это создать свою реализацию класса Printer и подключить её к фреймворку параллельно с остальными принтерами. Такой подход описан в примере №9 док-ции по GoogleTest Framework.
Сначала реализовать класс принтера, наследованный от EmptyTestEventListener
:
// 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
Теперь подключить к юнит тестам вместе с другими принтерами:
UnitTest& unit_test = *UnitTest::GetInstance(); TestEventListeners& listeners = unit_test.listeners(); listeners.Append(new TersePrinter);
Всё. Теперь результаты будут выводиться без проблем и в окно Output, и в консоль, и куда-то еще, если подключены дополнительные принтеры. Формат вывода можно изменять по своему вкусу. Кроме этого, по клику в окне Output можно будет "прыгать" на код "свалившегося" теста.