2011-08-19 55 views
2

適用範圍:使用Google測試和OpenCV。Google測試中的自定義EXPECT_NEAR宏

我想測試我的Vec3f等於另一個Vec3fVec3f是維度3和類型爲float的OpenCV中的向量。 ==運算符已定義,因此EXPECT_EQ(Vec3f(), Vec3f())工作。

但是,因爲它們是浮動的,我想使用宏EXPECT_NEAR(float a, float b, float delta)。我能做些什麼以便我可以像EXPECT_NEAR(vec_a, vec_b, float delta)那樣使用它?

目前,我正在遍歷矢量的每個元素並在那裏執行EXPECT_NEAR。

這可能與:Convenient method in GoogleTest for a double comparison of not equal?

回答

3

你正在做的基本上是正確的事情。但是,我會使用自定義斷言功能,例如:

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

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