Я пытаюсь захватить стандартный вывод в начале каждого отдельного теста, и если тест не пройден, только тогда распечатайте стандартный вывод. Мне нужно, чтобы это выполнялось для каждого TEST и TEST_F в каталоге, поэтому я ищу, могу ли я применить глобальное тестовое приспособление, если это возможно, к основному.
Я могу применить глобальную среду, но она запускается при установке и удалении средства запуска тестов. И я могу заставить это работать, добавляя код к каждому из моих многочисленных стандартных тестовых приспособлений, но я надеялся на глобальное решение, а не на изменение каждого приспособления.
struct dummyFixture : public ::testing::Test
{
// --- Need to apply this globally ---
void SetUp()
{
backup = std::cout.rdbuf();
std::cout.rdbuf(testingSink.rdbuf());
}
void TearDown()
{
std::cout.rdbuf(backup);
if (::testing::Test::HasFailure())
std::cout << testingSink.str() << std::endl;
testingSink.str(std::string());
}
private:
std::stringstream testingSink;
std::streambuf *backup;
};
TEST(dummyTest, test_pass)
{
// should not print log to console
std::cout << "DUMMY TEST" << std::endl;
EXPECT_TRUE(true);
}
TEST_F(dummyFixture, test_fail)
{
// should print log to console
std::cout << "DUMMY TEST FIXTURE" << std::endl;
EXPECT_TRUE(false);
}
int main(int argc, char **argv)
{
::testing::InitGoogleTest(&argc, argv);
return RUN_ALL_TESTS();
}
Поскольку вы не хотите изменять какие-либо текстовые фикстуры и хотите запустить это так же, как SetUp() и TearDown() тестовой фикстуры, вы можете попробовать подход, описанный ниже.
class Logger
{
Logger()
{
backup = std::cout.rdbuf();
std::cout.rdbuf(testingSink.rdbuf());
}
~Logger()
{
std::cout.rdbuf(backup);
if (::testing::Test::HasFailure())
std::cout << testingSink.str() << std::endl;
testingSink.str(std::string());
}
private:
std::stringstream testingSink;
std::streambuf *backup;
};
Теперь вы можете получить все свои тестовые классы (производные от ::testing::test) из этого класса Logger.
struct dummyFixture : public ::testing::Test, **public Logger**
{
};
В GTest также есть методы CaptureStdout() и GetCapturedStdout() для получения захваченной строки stdout, вы также можете их использовать.
Это гарантирует, что вы достигнете того, что пытаетесь сделать с минимальными изменениями кода.
Приносим свои извинения за поздний ответ! Итак, из вашего ответа не похоже, что я могу перезаписать глобальную фикстуру, но я могу просто изменить цепочку наследования любых производных фикстур, чтобы вставить мою новую фикстуру во все. Это не идеально, но работает, так что спасибо за помощь!