【问题标题】:How to test a class with google test?如何使用谷歌测试测试课程?
【发布时间】:2022-07-27 00:05:51
【问题描述】:

我刚学google test,我有一个class,想测试一下它的成员函数,下面是demo代码:

class B {
    //......
};
class A {
public:
    //.....
    void add (string s, B* ptrb) { m.insert(s, ptrb); }
    void remove(string s) { 
        auto it = m.find(s);
        if (it != m.end())
            m.erase(it); 
    }
    B* operator[](string s)
    {
        auto it = m.find(s);
        if (it != m.end())
            return (*it).second;
    }
    //.....
protected:
    map<B*> m;
    //.....
}

如果我想像这样测试add:

class mygtest : public ::testing::Test
{
protected:
    //....setup
    //....teardown
    A a;
};

TEST_F(mygtest, testadd)
{
    B b1;
    B b2;
    a.add("1", &b1);
    a.add("2", &b2);
    //...how should i do next?
    EXPECT_EQ(.....) //compare with who?
}

这是第一个问题。

第二个问题是:

在某些情况下,我必须先调用另一个成员函数来获取值,然后使用EXPECT_EQ来测试当前成员函数,如何在不使用其他成员函数的情况下测试一个函数?有必要吗?

【问题讨论】:

  • 旁白:不要害怕-&gt; 运算符用于指针或迭代器。我觉得it-&gt;second 比(*it).second 更具可读性,也更容易打字。

标签: c++ googletest googlemock


【解决方案1】:

您只需验证A 的状态是否已根据需要更改。 所以只需检查它是否包含添加的对象。

TEST_F(mygtest, testadd)
{
    B b1;
    B b2;
    a.add("1", &b1);
    a.add("2", &b2);

    EXPECT_EQ(a["1"], &b1);
    EXPECT_EQ(a["2"], &b2);
    EXPECT_EQ(a["3"], nullptr);
}

https://godbolt.org/z/ezrjdY6hh

由于没有足够的上下文,所以不可能改进这个测试(看起来不太好)。

您无法避免使用不同的功能。你正在测试一个类的行为。因此,您要验证其他函数在状态更改后是否执行其他操作。

不要认为将测试与生产类联系起来。这是不好的做法,因为这会使测试与实现细节纠缠在一起。测试检查实现细节时,您将无法重构生产代码。

这是我通常对测试进行的小型重构,以提高测试的维护难度:https://godbolt.org/z/Tc1n9Evzs

【讨论】:

  • 您的测试(如果还没有编译器标志)可能会发现 OP 的元素代码不存在的问题 :-)
  • 我已经在 Godbolt 中修复了这个问题,因为编译器抱怨了很多问题(不仅仅是这个)。
猜你喜欢
  • 1970-01-01
  • 2023-03-11
  • 2015-11-12
  • 2015-03-27
  • 1970-01-01
  • 2020-09-03
  • 2012-03-30
  • 2023-02-17
  • 2011-06-14
相关资源
最近更新 更多