Недавно я разработал модуль временных рядов, где мои временные ряды по сути являются SortedDictionnary<DateTime, double>
.
Теперь я хотел бы создать модульные тесты, чтобы убедиться, что этот модуль всегда работает и дает ожидаемый результат.
Обычной операцией является вычисление производительности между точками во временном ряду.
Поэтому я делаю временные ряды с, скажем, {1.0, 2.0, 4.0} (в некоторые даты), и я ожидаю, что результат будет {100%, 100%}.
Дело в том, что если я вручную создаю временной ряд со значениями {1.0, 1.0} и проверяю равенство (сравнивая каждую точку), тест не будет пройден, так как всегда будут неточности при работе с двоичными представлениями реального номера.
Поэтому я решил создать следующую функцию:
private static bool isCloseEnough(double expected, double actual, double tolerance=0.002)
{
return squaredDifference(expected, actual) < Math.Pow(tolerance,2);
}
Есть ли другой распространенный способ справиться с таким делом?
источник
Assert.That(result, Is.InRange(expected-tolerance, expected+tolerance));
потерпит неудачу, еслиtolerance/abs(expected) < 1E-16
.abs(expected)
это будет однозначный или двузначный знак. Я также предположил допуск в районе 1E-9. При этих допущениях этот, по общему признанию, упрощенный подход мог бы служить вам достаточно хорошо (я используюIs.InRange
в своих тестах).Как предложил RichardM, если вы не используете NUnit, лучшим способом будет Assert.AreEqual (double, double, double) , где последний является точностью.
источник
Это зависит от того, что вы делаете с числами. Если вы тестируете метод, который должен, например, выбирать подходящее значение из входного набора на основе некоторых критериев, то вам следует проверить на строгое равенство. Если вы выполняете вычисления с плавающей запятой, обычно вам нужно тестировать с ненулевым допуском. Насколько велик допуск, зависит от расчетов, но с двойной точностью хорошей отправной точкой является выбор относительного допуска 1E-14 для простых вычислений и 1E-8 (допуск) для более сложных. Конечно, YMMV, и вам нужно добавить небольшую абсолютную погрешность, если ожидаемый результат равен 0.
источник