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

标签 c++ unit-testing comparison-operators

在单元测试代码中,在新成员可能已添加到类的假设下,哪种测试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/

相关文章:

c++ - C++11 中的函数式编程,F# 风格

c++ - 以下是否等同于前向声明?

c++ - 使用数学将 c++ 字符串加倍

python - python中a<b<c是什么意思?

由文字分配的字符串的 C++ 管理

c# - 在调用 .Object 属性后更改 Mock<IType> 对象

unit-testing - 使用 mocha 进行所有测试后在哪里删除数据库并关闭连接

unit-testing - "Unit Testing"属于白盒测试还是黑盒测试?

python - 在Python中,如何知道对象是否可以比较?

javascript - 根据季节(当前日历月)更改 <body> 的背景图片(在 CSS 中)