Ich habe eine Frage zu junit assertEquals
, um Doppelwerte zu testen. Beim Lesen des API-Dokuments kann ich Folgendes sehen:
@Deprecated public static void assertEquals(double expected, double actual)
Veraltet. Verwenden Sie stattdessen assertEquals (doppelt erwartet, doppelt tatsächlich, doppelt epsilon)
Was bedeutet der epsilon
Wert? (Epsilon ist ein Buchstabe im griechischen Alphabet, oder?)
Kann mir jemand erklären, wie man es benutzt?
java
unit-testing
junit
Édipo Féderle
quelle
quelle
<=
nicht sein<
.doubleIsDifferent
(zum Vergleichen von Doppelwerten) aufruft und zurückgibtMath.abs(d1 - d2) > delta
. Wenn also die Differenz zwischen d1 und d2 höher als Delta ist, bedeutet dies, dass die Werte unterschiedlich sind und true zurückgeben. Es wird false zurückgegeben, wenn die Werte als gleich angesehen werden. Diese Methode wird in den assertEquals direkt aufgerufen. Wenn sie true zurückgibt, werden die assertEquals aufgerufenfailNotEquals
und das Testergebnis ist ein Fehler.Welche Version von JUnit ist das? Ich habe immer nur Delta gesehen, kein Epsilon - aber das ist ein Nebenproblem!
Aus dem JUnit Javadoc :
Es ist wahrscheinlich übertrieben, aber ich benutze normalerweise eine sehr kleine Zahl, z
Wenn Sie Hamcrest- Assertions verwenden, können Sie den Standard nur
equalTo()
mit zwei Doppelwerten verwenden (es wird kein Delta verwendet). Wenn Sie jedoch ein Delta möchten, können Sie es einfach verwendencloseTo()
(siehe javadoc ), zZu Ihrer Information, die kommende JUnit 5 wird Delta auch optional machen, wenn Sie
assertEquals()
mit zwei Doppel anrufen . Die Implementierung (wenn Sie interessiert sind) ist:quelle
Gleitkommaberechnungen sind nicht genau - es gibt häufig Rundungsfehler und Fehler aufgrund der Darstellung. (Zum Beispiel kann 0.1 nicht genau im binären Gleitkomma dargestellt werden.)
Aus diesem Grund ist es normalerweise keine gute Idee, zwei Gleitkommawerte direkt auf Gleichheit zu vergleichen, da sie sich je nach Berechnung geringfügig unterscheiden können.
Das "Delta", wie es in den JUnit- Javadocs genannt wird , beschreibt den Unterschied, den Sie in den Werten tolerieren können, damit sie immer noch als gleich angesehen werden. Die Größe dieses Werts hängt vollständig von den Werten ab, die Sie vergleichen. Beim Vergleichen von Doppelwerten verwende ich normalerweise den erwarteten Wert geteilt durch 10 ^ 6.
quelle
Die Sache ist, dass zwei Doppel aufgrund von Genauigkeitsproblemen, die Gleitkommazahlen inhärent sind, möglicherweise nicht genau gleich sind. Mit diesem Delta-Wert können Sie die Bewertung der Gleichheit anhand eines Fehlerfaktors steuern.
Einige Gleitkommawerte können auch spezielle Werte wie NAN und -Infinity / + Infinity haben, die die Ergebnisse beeinflussen können.
Wenn Sie wirklich vergleichen möchten, dass zwei Doppel genau gleich sind, vergleichen Sie sie am besten als lange Darstellung
Oder
Welches kann diese Nuancen berücksichtigen.
Ich habe mich nicht mit der fraglichen Assert-Methode befasst, kann aber nur davon ausgehen, dass die vorherige für diese Art von Problemen veraltet war und die neue sie berücksichtigt.
quelle
Epsilon ist ein Unterschied zwischen
expected
undactual
Werten, die Sie akzeptieren können, wenn Sie glauben, dass sie gleich sind. Sie können.1
zum Beispiel einstellen .quelle
Beachten Sie, dass es nichts Falsches ist, wenn Sie keine genauen Gleitkommawerte angeben, wenn Sie nicht rechnen. Zum Beispiel:
In diesem Fall wollen Sie sicherstellen , es ist wirklich
MIN_VALUE
nicht Null oder-MIN_VALUE
oderMIN_NORMAL
oder ein anderer sehr kleiner Wert. Sie können sagenDies führt jedoch zu einer Abwertungswarnung. Um dies zu vermeiden, können Sie
assertEquals(Object, Object)
stattdessen anrufen :Und wenn Sie wirklich schlau aussehen wollen:
Oder Sie können einfach Behauptungen im fließenden Stil von Hamcrest verwenden:
Wenn der Wert, den Sie überprüfen, jedoch aus Berechnungen stammt, verwenden Sie das Epsilon.
quelle
quelle