Mam pytanie o junit assertEquals
do testowania podwójnych wartości. Czytając dokument API, widzę:
@Deprecated public static void assertEquals(double expected, double actual)
Przestarzałe. Zamiast tego należy użyć assertEquals (podwójne oczekiwane, podwójne rzeczywiste, podwójne epsilon)
Co oznacza epsilon
wartość? (Epsilon to litera alfabetu greckiego, prawda?).
Czy ktoś może mi wyjaśnić, jak go używać?
java
unit-testing
junit
Édipo Féderle
źródło
źródło
<=
nie powinno być<
.doubleIsDifferent
(do porównywania podwójnych wartości) i zwracaMath.abs(d1 - d2) > delta
. Więc jeśli różnica między d1 i d2 jest większa niż delta, oznacza to, że wartości są różne i zwróci true. Zwróci false, jeśli wartości zostaną uznane za równe. Ta metoda jest wywoływana bezpośrednio w assertEquals, a jeśli zwróci true, assertEquals zadzwoni,failNotEquals
a wynik testu zakończy się niepowodzeniem.Która to wersja JUnit? Widziałem tylko deltę, a nie epsilon - ale to poboczny problem!
Z JUnit javadoc :
To chyba przesada, ale zazwyczaj używam naprawdę małej liczby, np
Jeśli używasz twierdzeń hamcrest , możesz po prostu użyć standardu
equalTo()
z dwoma podwójnymi (nie używa delty). Jednak jeśli chcesz delty, możesz po prostu użyćcloseTo()
(patrz javadoc ), npDo Twojej wiadomości, że nadchodzący JUnit 5 sprawi, że delta będzie również opcjonalny, gdy będziesz sprawdzać
assertEquals()
z dwoma podwójnymi. Wdrożenie (jeśli jesteś zainteresowany) jest:źródło
Obliczenia zmiennoprzecinkowe nie są dokładne - często występują błędy zaokrągleń i błędy wynikające z reprezentacji. (Na przykład 0,1 nie może być dokładnie reprezentowane w binarnym zmiennoprzecinkowym.)
Z tego powodu bezpośrednie porównywanie dwóch wartości zmiennoprzecinkowych dla równości zwykle nie jest dobrym pomysłem, ponieważ mogą się one nieznacznie różnić w zależności od sposobu ich obliczenia.
„Delta”, jak to się nazywa w javadocs JUnit , opisuje różnicę, którą można tolerować w wartościach, aby nadal były uważane za równe. Rozmiar tej wartości jest całkowicie zależny od porównywanych wartości. Porównując liczby podwójne, zwykle używam wartości oczekiwanej podzielonej przez 10 ^ 6.
źródło
Chodzi o to, że dwa podwójne mogą nie być dokładnie równe z powodu problemów z precyzją związanych z liczbami zmiennoprzecinkowymi. Za pomocą tej wartości delta można kontrolować ocenę równości w oparciu o współczynnik błędu.
Również niektóre wartości zmiennoprzecinkowe mogą mieć specjalne wartości, takie jak NAN i -Infinity / + Infinity, które mogą wpływać na wyniki.
Jeśli naprawdę zamierzasz porównać, że dwa podwójne są dokładnie takie same, najlepiej porównać je jako długą reprezentację
Lub
Które mogą wziąć pod uwagę te niuanse.
Nie zagłębiłem się w omawianą metodę Assert, ale mogę jedynie założyć, że poprzednia była przestarzała dla tego rodzaju problemów, a nowa bierze je pod uwagę.
źródło
Epsilon jest różnica między
expected
iactual
wartości, które można zaakceptować myśli, że są równe. Możesz ustawić.1
na przykład.źródło
Pamiętaj, że jeśli nie robisz matematyki, nie ma nic złego w zapewnianiu dokładnych wartości zmiennoprzecinkowych. Na przykład:
W tym przypadku, chcesz się upewnić, że to naprawdę
MIN_VALUE
nie zero lub-MIN_VALUE
lubMIN_NORMAL
lub jakiś inny bardzo małą wartość. Możesz powiedziećale dostaniesz ostrzeżenie o rezygnacji. Aby tego uniknąć, możesz
assertEquals(Object, Object)
zamiast tego zadzwonić :A jeśli naprawdę chcesz wyglądać sprytnie:
Lub możesz po prostu użyć płynnych twierdzeń Hamcrest:
Jeśli wartość jesteś sprawdzanie ma pochodzić z jakiejś matematyki, choć użyć epsilon.
źródło
źródło