Ответ 1
Используйте взамен EXPECT_NEAR
или DoubleEq
. Операции с плавающей запятой могут приводить к ошибкам округления, что сильно отличает результаты.
Я не могу понять, почему тестовый пример завершился неудачей в случае суммирования двойных чисел или поплавков. Он работает очень точно для целочисленного типа данных.
//метод в 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
Используйте взамен EXPECT_NEAR
или DoubleEq
. Операции с плавающей запятой могут приводить к ошибкам округления, что сильно отличает результаты.
См. документацию по Сравнению с плавающей точкой
EXPECT_EQ
использует точное совпадение.
Но вы не можете точно сопоставить два плавающих числа. (по крайней мере, с легкостью.)
Вы можете использовать EXPECT_FLOAT_EQ
или EXPECT_DOUBLE_EQ
. (с эвристическими границами)
Также вы можете использовать EXPECT_NEAR
с конкретными границами.
С https://testing.googleblog.com/2008/10/tott-floating-point-comparison.html
При сравнении значений с плавающей точкой проверка на равенство может привести до неожиданных результатов. Ошибки округления могут привести к результату, который близок к ожидаемому, но не равен. Как следствие, утверждение может потерпеть неудачу при проверке на равенство двух чисел с плавающей точкой количества, даже если программа реализована правильно.
Google C++ Testing Framework предоставляет функции для сравнения двух чисел с плавающей точкой количества до заданной точности.
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));
}
Это просто ошибка в Googletest. Текстовый вывод должен доказать сбой, но формат его точно не указан.