opencv Google Test中的自定义EXPECT_NEAR宏

44u64gxh  于 8个月前  发布在  Go
关注(0)|答案(2)|浏览(96)

范围:使用Google Test和OpenCV。
我想测试一下我的Vec3f是否等于另一个Vec3fVec3f是OpenCV中的一个3维向量,类型为float。定义了==-运算符,所以EXPECT_EQ(Vec3f(), Vec3f())可以工作。
但是因为它们是浮点数,我想使用EXPECT_NEAR(float a, float b, float delta)宏。我怎么做才能像EXPECT_NEAR(vec_a, vec_b, float delta)一样使用它?
现在我正在遍历vector的每个元素,并在那里执行EXPECT_NEAR。
这可能与Convenient method in GoogleTest for a double comparison of not equal?有关

aelbi1ox

aelbi1ox1#

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

#include <gmock/gmock.h>

using testing::Pointwise;

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

TEST(FooTest, ArraysNear) {
  EXPECT_THAT(result_array, Pointwise(NearWithPrecision(0.1), expected_array));
}
ioekq8ef

ioekq8ef2#

你做的基本上是正确的。但是,我会使用一个自定义Assert函数,如:

::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))

如果expect失败,输出可能是:

Value of: AreAllElementsInVectorNear(a, b, 0.1)
  Actual: false (Vectors differ by more then 0.1)
Expected: true

相关问题