Google Test 中的自定义 EXPECT_NEAR 宏

问题描述 投票:0回答:2

范围:使用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 中用于不等于的双重比较的便捷方法?

unit-testing macros opencv googletest
2个回答
10
投票

您可以使用 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));
}

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。请注意,该代码假设 << operator is provided for 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
© www.soinside.com 2019 - 2024. All rights reserved.