У меня есть вопрос о junit assertEquals
для проверки двойных значений. Читая документацию по API, я вижу:
@Deprecated public static void assertEquals(double expected, double actual)
Устаревшее. Вместо этого используйте assertEquals (двойной ожидаемый, двойной фактический, двойной эпсилон)
Что означает epsilon
значение? (Эпсилон это буква в греческом алфавите, верно?).
Может кто-нибудь объяснить мне, как его использовать?
java
unit-testing
junit
Эдипо Федерле
источник
источник
<=
не так<
.doubleIsDifferent
(для сравнения двойных значений) и возвращаетMath.abs(d1 - d2) > delta
. Таким образом, если разница между d1 и d2 выше дельты, это означает, что значения отличаются и вернут true. Он вернет false, если значения считаются равными. Этот метод вызывается в assertEquals непосредственно, и если он возвращает true, assertEquals будет вызывать,failNotEquals
и результатом теста будет сбой.Какая версия JUnit это? Я только когда-либо видел дельту, а не эпсилон - но это побочный вопрос!
Из JUnit Javadoc :
Это, вероятно, излишне, но я обычно использую очень небольшое число, например
Если вы используете утверждения Hamcrest , вы можете просто использовать стандарт
equalTo()
с двумя двойными (он не использует дельту). Однако, если вы хотите дельту, вы можете просто использоватьcloseTo()
(см. Javadoc ), например,К вашему сведению, предстоящий JUnit 5 также сделает дельту необязательной при вызове
assertEquals()
с двумя двойными числами. Реализация (если вы заинтересованы) является:источник
Вычисления с плавающей точкой не точны - часто возникают ошибки округления и ошибки из-за представления. (Например, 0.1 не может быть точно представлено в двоичной форме с плавающей запятой.)
Из-за этого прямое сравнение двух значений с плавающей точкой на равенство обычно не очень хорошая идея, потому что они могут отличаться на небольшое количество, в зависимости от того, как они были вычислены.
«Дельта», как она называется в Javadocs JUnit , описывает величину разницы, которую вы можете допустить в значениях, чтобы они все еще считались равными. Размер этого значения полностью зависит от сравниваемых значений. При сравнении значений типа double я обычно использую ожидаемое значение, деленное на 10 ^ 6.
источник
Дело в том, что два двойных не могут быть точно равными из-за проблем точности, свойственных числам с плавающей запятой. С помощью этого дельта-значения вы можете контролировать оценку равенства на основе коэффициента ошибок.
Также некоторые значения с плавающей точкой могут иметь специальные значения, такие как NAN и -Infinity / + Infinity, которые могут влиять на результаты.
Если вы действительно хотите сравнить два одинаковых числа, лучше сравнить их как длинное представление.
Или
Который может учитывать эти нюансы.
Я не углублялся в рассматриваемый метод Assert, но могу только предположить, что предыдущий был признан устаревшим для такого рода проблем, а новый действительно учитывает их.
источник
Эпсилон разница между
expected
иactual
ценности , которые вы можете принять думать , что они равны. Вы можете установить,.1
например.источник
Обратите внимание, что если вы не занимаетесь математикой, нет ничего плохого в утверждении точных значений с плавающей запятой. Например:
В этом случае вы хотите убедиться, что оно действительно
MIN_VALUE
, а не ноль или-MIN_VALUE
илиMIN_NORMAL
или какое-то другое очень маленькое значение. Ты можешь сказатьно вы получите предупреждение об устаревании. Чтобы избежать этого,
assertEquals(Object, Object)
вместо этого вы можете позвонить :И, если вы действительно хотите выглядеть умно:
Или вы можете просто использовать утверждения Hamcrest в свободном стиле:
Если значение, которое вы проверяете, получается из-за какой-то математики, используйте epsilon.
источник
источник