5

範囲: Google Test と OpenCV を使用。

Vec3fmyが another と等しいことをテストしたいと思いVec3fます。Vec3f次元 3 の OpenCV のベクトルであり、float 型です。==-operator が定義されているので、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()マッチャーを使用できます。2 つの引数が近いことを確認するカスタム マッチャーと組み合わせます。

#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 はコードを含めて、たとえば両方のベクトルが同じサイズであるかどうかを比較し、続いてすべての要素を反復処理し、同じインデックスの要素の違いがデルタ以下であるかどうかを相互にチェックします。このコードは、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 に答える