C ++ / GoogleTest-如何在链接目录中为每个测试运行安装程序

时间:2019-05-30 10:03:37

标签: c++ unit-testing googletest

我正在尝试在每个单独的测试开始时捕获标准输出,如果测试失败,则仅打印该标准输出。我需要在目录中的每个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();
}

1 个答案:

答案 0 :(得分:0)

由于您不想修改任何文本夹具,并且希望像测试夹具的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类派生所有测试类(派生自:: testing :: test)。

struct dummyFixture : public ::testing::Test, **public Logger**
{
};

GTest还具有方法CaptureStdout()和GetCapturedStdout()来获取捕获的stdout字符串,您也可以使用它们。

这将确保您以最小的代码更改即可实现您想要的工作。