Google Test中的自定义EXPECT_NEAR宏

Una*_*dra 4 macros opencv unit-testing googletest

范围:使用Google Test和OpenCV.

我想测试一下我的Vec3f另一个Vec3f.Vec3f是OpenCV中尺寸为3且类型为float的向量.== - 运算符已定义,因此EXPECT_EQ(Vec3f(), Vec3f())有效.

但由于它们是花车,我想使用EXPECT_NEAR(float a, float b, float delta)宏.我该怎么办才能使用它EXPECT_NEAR(vec_a, vec_b, float delta)

目前我循环遍历向量的每个元素并在那里进行EXPECT_NEAR.

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

Vla*_*sev 8

您可以使用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));
}
Run Code Online (Sandbox Code Playgroud)


dme*_*ter 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;
}
Run Code Online (Sandbox Code Playgroud)

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

然后使用该函数:

EXPECT_TRUE(AreAllElementsInVectorNear(a, b, 0.1))
Run Code Online (Sandbox Code Playgroud)

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

Value of: AreAllElementsInVectorNear(a, b, 0.1)
  Actual: false (Vectors differ by more then 0.1)
Expected: true
Run Code Online (Sandbox Code Playgroud)