是否可以在 googletest 的 Predicate Formatter 中使用 ASSERT_NEAR

Is it possible to use ASSERT_NEAR in Predicate Formatter in googletest

我们如何使用 ASSERT_NEAR 或 ASSERT_DOUBLE_EQ 浮动比较而不使用谓词格式化程序函数中的 googletest 内部内容?

template<typename A, typename B>
::testing::AssertionResult assertNearArrays(const char * a_expr,
                                              const char * b_expr,
                                              const A & a,
                                              const B & b,
                                              PREC absError = 1e-6){

      test each value of a with b
      using ASSERT_NEAR(a[i],b[i], 1e-6)
 }

我认为这行不通,我需要编写自己的比较并返回 AssertionResultAssertionFailure。 但是依靠googletest而不是我自己的浮点数比较会很好...?

只需几行C++代码就可以写出这样的测试:

template<typename T>    
bool is_near(T val1, T val2, T abs_error) {
  const T diff = std::abs(val1 - val2);
  return  diff <= abs_error:
}

您真的需要完全按照 gtest ASSERT_NEAR 的要求去做吗?您可能想提供有关失败的其他信息,而不是 ASSERT_NEAR 会做的事情,例如:

  if (!is_near(a[i], b[i], absError))
    return AssertionFailure()
      << "The difference between a[i] and b[i]"
      << " is " << (a[i] - b[i]) << ", which exceeds absError, where\n"
      << "a[i] evaluates to " << a[i] << ",\n"
      << "b[i] evaluates to " << b[i]<< ", and\n"
      << "absError evaluates to " << absError << ", and\n"
      << "i evaluates to " << i << ".";

return AssertionSuccess();在 assertNearArrays

的末尾