在单元测试代码中,在新成员可能已添加到类的假设下,哪种测试operator==
比较运算符的最佳方法?
例如:
struct A {
int a, b;
bool operator==( const A& other ) const { return( a == other.a && b == other.b ); }
};
int Test() {
A a1, a2;
EXPECT_TRUE( a1 == a2 );
}
然后我们更改A,添加一个新的成员变量c
。
使用当前的测试/比较运算符,当 c
不同时,我们将得到假阴性。
是否有替代/低级别的方法来比较两个对象?
最佳答案
当测试你的operator==
时,你应该检查两件事:
当对象相等时返回
true
。当对象不相等时返回
false
。
正如您正确观察到的那样,当有人添加更多成员但忘记更新 operator==
定义时,条件 1 将不受影响。这就是为什么第二个标准很重要。请注意,现在,通过将 operator==
实现为 return true;
,您的测试将通过。
因此,您可能希望您的测试形状如下:
int Test() {
A a12{1, 2};
A a12_{1, 2};
A a23{2, 3};
EXPECT_TRUE( a12 == a12 );
EXPECT_TRUE( a12 == a12_ );
EXPECT_FALSE( a12 == a23 );
EXPECT_FALSE( a23 == a12 );
}
现在,给定这段代码,添加成员 c
的人也可能会忘记更新测试并且没有任何事情会失败(注意:如果 A
有一个构造函数而不是一个聚合,测试将无法构建,这不是问题,但问题包含一个聚合)。有一定程度的无能是你无法防范的。另请注意,也许您不希望c
有助于比较(如果它是例如std::mutex
怎么办?)- 这取决于关于您对(不)平等的定义。
总的来说,不要试图预测 future ,这通常是白费力气而且不会奏效(尽管你会主要记住它计算出来的时间)。
关于c++ - 在单元测试中,如何在不使用运算符== 的情况下比较两个对象,这可能会错过新成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59093114/