29

我无法理解为什么在对双数或浮点数求和的情况下测试用例会失败。它适用于整数数据类型。

//simple_method.h 中的方法

double sum ( double a, double b)
{
    double res = a+b;
    return res;
}

// 这个方法的测试用例

TEST(simpleSum, sumOfFloat)
{
    EXPECT_EQ(4.56, sum(0.56, 4.0));
}

// 输出是

Running main() from gtest_main.cc
[==========] Running 1 test from 1 test case.
[----------] Global test environment set-up.
[----------] 1 test from simpleSum
[ RUN      ] simpleSum.sumOfFloat
/home/pcadmin/Desktop/so/so3/simple_method_test.cpp:7: Failure
Value of: sum(0.56, 4.0)
  Actual: 4.56
Expected: 4.56
[  FAILED  ] simpleSum.sumOfFloat (0 ms)
[----------] 1 test from simpleSum (0 ms total)

[----------] Global test environment tear-down
[==========] 1 test from 1 test case ran. (0 ms total)
[  PASSED  ] 0 tests.
[  FAILED  ] 1 test, listed below:
[  FAILED  ] simpleSum.sumOfFloat

 1 FAILED TEST
4

4 回答 4

48

改用EXPECT_NEARDoubleEq匹配器。浮点运算可能会导致舍入误差,从而使结果略有不同。

于 2013-02-28T06:06:54.237 回答
33

请参阅浮点比较文档

EXPECT_EQ使用完全匹配。但是你不能完全匹配两个浮点数。(至少很容易。)

您可以使用EXPECT_FLOAT_EQEXPECT_DOUBLE_EQ。(带有启发式边界)此外,您可以使用EXPECT_NEAR特定的边界。

于 2013-02-28T06:09:00.373 回答
4

来自https://testing.googleblog.com/2008/10/tott-floating-point-comparison.html

比较浮点值时,检查是否相等可能会导致意外结果。舍入误差可能导致结果接近预期,但不相等。因此,即使程序正确实现,在检查两个浮点数是否相等时,断言也可能会失败。

Google C++ 测试框架提供了比较两个浮点数到给定精度的函数。

ASSERT_FLOAT_EQ(expected, actual);
ASSERT_DOUBLE_EQ(expected, actual);

EXPECT_FLOAT_EQ(expected, actual);
EXPECT_DOUBLE_EQ(expected, actual);

在你的情况下,

TEST(simpleSum, sumOfFloat)
{
    EXPECT_DOUBLE_EQ(4.56, sum(0.56, 4.0));
}
于 2019-08-22T07:09:46.677 回答
-5

这只是 Googletest 中的一个错误。文本输出应该证明失败,但它的格式没有精确指定。

于 2016-01-19T10:17:40.600 回答