gpt4 book ai didi

c++ - 在单元测试中,如何在不使用运算符== 的情况下比较两个对象,这可能会错过新成员?

转载 作者:行者123 更新时间:2023-11-30 02:13:34 25 4
gpt4 key购买 nike

在单元测试代码中,在新成员可能已添加到类的假设下,哪种测试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==时,你应该检查两件事:

  1. 当对象相等时返回true

  2. 当对象不相等时返回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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com