我试图在每个单独的测试开始时捕获标准输出,如果测试失败,则只打印标准输出。我需要它为每个 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;
};
您现在可以从此 Logger 类派生所有测试类(派生自
::test::test(。struct dummyFixture : public ::testing::Test, **public Logger**
{
};
GTest也有方法CaptureStdout((和GetCapturedStdout((来获取捕获的stdout字符串,你也可以使用它们。
这将确保您以最少的代码更改实现您尝试执行的操作。