Модули тестирования модулей float в Visual Studio 2008 Pro
У меня есть некоторые модульные тесты на С#, которые выполняют некоторые операции float/double, и я хотел бы unit test их. Assert.AreEqual недостаточно из-за ошибок округления.
В качестве примера возьмем преобразование единиц. 10,5 метров до фута имеет коэффициент пересчета 3,281, поэтому я получаю 34.4505. Использование более точного коэффициента преобразования дает мне 34.4488189. Я хочу протестировать это, скажем, 0,1 (так что 34.3488-34.5488 пройдет тест).
Я мог бы вручную проверить значение с допуском в моем unit test, но это очень повторяющееся, а сообщение об ошибке не было бы очень описательным (опять же без необходимости писать собственное сообщение об ошибке Assert):
Assert.IsTrue(Math.Abs(34.4488189 - value) < 0.1);
Как я могу unit test выполнить мои операции с плавающей точкой с допустимым допуском? Я не могу найти классы Assert, которые делают это с VS. Я пропустил его или мне нужно катиться самостоятельно?
Существуют ли стандартные методы тестирования float/doubles, которые нужно иметь в виду?
Ответы
Ответ 1
Assert.AreEqual в MSTest имеет перегрузки, которые принимают параметр дельта (допустимый погрешность):
public static void AreEqual (double expected, double actual, double delta)
например:
Assert.AreEqual(34.4488189, value, 0.1);
или, для минимально возможного допуска:
Assert.AreEqual(34.4488189, value, double.Epsilon);
Ответ 2
Вы можете взглянуть на NUnit framework:
//Compare Float values
Assert.AreEqual(float expected, float actual, float tolerance);
Assert.AreEqual(float expected, float actual, float tolerance, string message);
//Compare Double values
Assert.AreEqual(double expected, double actual, double tolerance);
Assert.AreEqual(double expected, double actual, double tolerance, string message)
(Выше взято из эта статья)
Более перечисленные здесь.
Ответ 3
NUnit может сравнивать в пределах допуска, предоставляя третий аргумент метода AreEqual. Посмотрите NUnit Equality Asserts
Visual Studio Unit Testing также имеет следующее: Метод AreEqual (Double, Double, Double, String)
Ответ 4
Я нахожусь на своем телефоне, поэтому прошу прощения за код/ссылки.
Здесь есть вопрос о любимых расширениях С#, где люди имеют расширенный встроенный тип, такой как строка. Вы можете расширить тип float с помощью метода, который будет работать следующим образом:
Myfloat.IsInTolerance(34.8f, 0.1f)
.., который вернет true, если float Myfloat равен 0.1 с каждой стороны 34.8. Это может сделать его менее трудоемким.
Ответ 5
Посмотрите на ограничения NUnit Equality Constraints, они гибкие! Надеюсь, это поможет!