如何用 google 测试来测试 class?
How to test a class with google test?
刚学google测试,我有一个class
,想测试一下它的成员函数,下面是演示代码:
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
测试当前成员函数,如何在不使用其他成员的情况下测试一个函数功能?如果有必要?
您只需验证 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
由于没有足够的上下文,因此不可能改进此测试(它看起来不太好)。
您无法避免使用不同的功能。您正在测试 class 的行为。因此,您正在验证其他函数在状态更改后执行其他操作。
不要想着把测试与生产交朋友 class。这是不好的做法,因为这会使测试与实现细节纠缠在一起。当测试检查实现细节时,您将无法重构生产代码。
这里是我经常做的小测试重构,以提高维护测试的容易程度:https://godbolt.org/z/Tc1n9Evzs
刚学google测试,我有一个class
,想测试一下它的成员函数,下面是演示代码:
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
测试当前成员函数,如何在不使用其他成员的情况下测试一个函数功能?如果有必要?
您只需验证 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
由于没有足够的上下文,因此不可能改进此测试(它看起来不太好)。
您无法避免使用不同的功能。您正在测试 class 的行为。因此,您正在验证其他函数在状态更改后执行其他操作。
不要想着把测试与生产交朋友 class。这是不好的做法,因为这会使测试与实现细节纠缠在一起。当测试检查实现细节时,您将无法重构生产代码。
这里是我经常做的小测试重构,以提高维护测试的容易程度:https://godbolt.org/z/Tc1n9Evzs