5

范围:使用 Google Test 和 OpenCV。

我想测试一下 my Vec3fequals another Vec3fVec3f是 OpenCV 中维数为 3 的向量,类型为浮点数。==-运算符已定义,因此EXPECT_EQ(Vec3f(), Vec3f())有效。

但由于它们是浮点数,我想使用EXPECT_NEAR(float a, float b, float delta)宏。我该怎么做才能像使用它一样使用它EXPECT_NEAR(vec_a, vec_b, float delta)

目前我正在遍历向量的每个元素并在那里执行 EXPECT_NEAR 。

这可能是相关的:GoogleTest 中用于不等于双重比较的便捷方法?

4

2 回答 2

9

您可以使用Google Mock中的Pointwise()匹配器。将它与一个自定义匹配器结合起来,检查两个参数是否接近:

#include <tr1/tuple>
#include <gmock/gmock.h>

using std::tr1::get;
using testing::Pointwise;

MATCHER_P(NearWithPrecision, precision, "") {
  return abs(get<0>(arg) - get<1>(arg)) < precision;
}

TEST(FooTest, ArraysNear) {
  EXPECT_THAT(result_array, Pointwise(NearWithPrecision(0.1), expected_array));
}
于 2011-08-20T00:52:35.923 回答
4

你做的事情基本上是正确的。但是,我会使用自定义断言函数,例如:

::testing::AssertionResult AreAllElementsInVectorNear(const Vec3f& a, const Vect3f& b, float delta) {
  if ([MAGIC])
    return ::testing::AssertionSuccess();
  else
    return ::testing::AssertionFailure() << "Vectors differ by more than " << delta;
}

然后,MAGIC 将包含您的代码以例如比较两个向量是否具有相同的大小,然后迭代所有元素并相互检查相同索引处的元素是否相差不超过 delta。请注意,代码假定为 Vec3f 提供了 << 运算符。

然后使用该函数:

EXPECT_TRUE(AreAllElementsInVectorNear(a, b, 0.1))

如果期望失败,输出可能是:

Value of: AreAllElementsInVectorNear(a, b, 0.1)
  Actual: false (Vectors differ by more then 0.1)
Expected: true
于 2011-08-19T12:46:02.130 回答