【问题标题】:writing googletests working on predefined object编写处理预定义对象的 googletests
【发布时间】:2017-02-12 07:41:46
【问题描述】:

我想为一个对象编写单元测试。与普通夹具的不同之处在于,我不希望在每次测试之前都运行夹具。夹具的 SetUp() 应该只运行一次,然后应该执行几个测试。在这些测试之后,应该执行夹具的 TearDown()。 我在 C++ 中使用 googletest。有没有可能实现这种行为?


清除示例:

#include "gtest/gtest.h"
class socketClientFixture : public testing::Test
{
public:
    CSocketClient *mClient;
    void SetUp()
    {
        mClient = new CSocketClient();
        mClient->connect();
    }
    void TearDown()
    {
        mClient->disconnect();
        delete mClient;
}
TEST_F(socketClientFixture, TestCommandA)
{
    EXPECT_TRUE(mClient->commandA());
}
TEST_F(socketClientFixture, TestCommandB)
{
    EXPECT_TRUE(mClient->commandA());
}
int  main(int ac, char* av[])
{
    ::testing::InitGoogleTest(&ac, av);
    int res = RUN_ALL_TESTS();
    return res;
}

在上面的示例中,我不希望在 TestCommandA 之后调用 TearDown(),在 TestCommandB 之前调用 SetUp()。 我想要实现的行为是:

  1. 设置()
  2. TestCommandA
  3. TestCommandB
  4. TearDown()

这是因为服务器在断开连接后需要一些时间来执行一些操作。

任何帮助表示赞赏。

【问题讨论】:

    标签: c++ unit-testing googletest fixtures


    【解决方案1】:

    没有内置的方法可以满足您的要求,特别是因为您要求订购测试。

    您可以从高级 google-test 文档中的 this section 中获取更多想法


    如果您愿意牺牲测试顺序,您可以按照上面链接中给出的确切示例定义static void SetUpTestCase()static void TearDownTestCase()。为该类编写的任何测试都将参与同一个夹具。

    请注意,如果您可以完全避免这种情况并将连接实例化为 Mock(请参阅 google-mock),那将是一个更好的选择。这将使您的测试与您要连接的服务器分离,因此您可以测试代码而不是测试服务器。这也将使您的测试运行得更快。

    【讨论】:

    • 谢谢!顺序并不重要。因此,我可以使用建议的方法。实际上我打算测试服务器的行为,客户端已经使用模拟测试了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-10
    • 1970-01-01
    • 2022-06-30
    • 2021-10-10
    • 1970-01-01
    • 2018-06-09
    相关资源
    最近更新 更多