C++ / GoogleTest - 如何 运行 在 link 目录中设置每个测试

C++ / GoogleTest - How to run Setup for each test in a link directory

我试图在每个单独测试开始时捕获标准输出,如果测试失败,则只打印标准输出。对于目录中的每个测试和 TEST_F,我都需要 运行,所以我正在寻找是否可以在可能的情况下将全局测试夹具应用到 main.

我可以应用全局环境,但这 运行 是在测试 运行 的设置和拆除时。我可以通过将代码添加到我的许多标准测试装置中的每一个来使它工作,但我希望有一个全局解决方案而不是更改每个装置。

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;
};

您现在可以从此记录器 class.

派生所有测试 classes(派生自 ::testing::test)
struct dummyFixture : public ::testing::Test, **public Logger**
{
};

GTest 也有方法 CaptureStdout() 和 GetCapturedStdout() 来获取捕获的标准输出字符串,你也可以使用它们。

这将确保您以最少的代码更改实现您想要做的事情。