Существует довольно простой способ использовать параллельный вывод googletest для ваших модульных тестов.
В нескольких словах вы можете создать свой собственный класс Printer, который выводит результаты непосредственно в окно вывода VisualStudio. Этот способ кажется более гибким, чем другие, потому что вы можете контролировать как содержимое результата (формат, подробности и т. д.), так и место назначения. Вы можете сделать это прямо в своей функции main()
. Вы можете использовать более одного принтера одновременно. И вы можете перейти к коду, дважды щелкнув сообщение об ошибке при неудачных тестах.
Вот шаги, чтобы сделать это:
- Создайте класс, производный от класса
::testing::EmptyTestEventListener
.
- Переопределить необходимые функции. Используйте функцию
OutputDebugString()
, а не printf()
.
- Перед вызовом
RUN_ALL_TESTS()
создайте экземпляр класса и свяжите его со списком слушателей gtest.
Ваш класс Printer может выглядеть следующим образом:
// 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);
Подход описан в примере № 9 из примеры Googletest.
person
Rom098
schedule
19.03.2012