Подтвердить что ты не робот

Модули тестирования модулей 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, которые нужно иметь в виду?

4b9b3361

Ответ 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)

(Выше взято из эта статья)

Более перечисленные здесь.

Ответ 4

Я нахожусь на своем телефоне, поэтому прошу прощения за код/​​ссылки.

Здесь есть вопрос о любимых расширениях С#, где люди имеют расширенный встроенный тип, такой как строка. Вы можете расширить тип float с помощью метода, который будет работать следующим образом:

Myfloat.IsInTolerance(34.8f, 0.1f)

.., который вернет true, если float Myfloat равен 0.1 с каждой стороны 34.8. Это может сделать его менее трудоемким.

Ответ 5

Посмотрите на ограничения NUnit Equality Constraints, они гибкие! Надеюсь, это поможет!