2017-10-18 2 views
5

die sich darauf verlassen usage documentation hat Beispiele wie folgt aus:Verwirrung über REST Assured Gleitkommazahlen Vergleiche

get("/lotto").then().body("lotto.lottoId", equalTo(5)); 

OK, so dass sie mit einem hamcrest Matcher 5 zum int Wert zu vergleichen.

Aber sie haben einen Abschnitt zu sagen, dass der Rest Assured JSON-Parser verwendet standardmäßig float und nicht double, so anstatt zu 12.12 das Vergleichen ich 12.12f vergleichen sollte:

get("/price").then().body("price", is(12.12f)); 

Warten, so tat, wie 5 Arbeit oben, das ist ein int und kein double? Verwendet der JSON-Parser verschiedene Grundelemente für ganzzahlige und nicht ganzzahlige Werte?

Aber es wird mehr verwirrend. Gut versierte Programmierer wissen, dass Sie Fließkommawerte ohnehin nicht direkt vergleichen sollten (wegen der Komplexität der Gleitkommawerte usw.). Stattdessen sollten Sie Matchers.closeTo(double operand, double error) verwenden, die eine Fehlermarge bietet. Dies ist der richtige Weg, es zu tun. Aber warte --- auch wenn ich 12.12f an Matchers.closeTo übergebe (Doppeloperand, Doppelfehler), wird es nicht immer noch in double konvertiert? Wird dies mit REST Assured funktionieren?

Antwort

1

Ich bin nicht 100% sicher, ob ich hier richtig bin, aber dieser Beitrag wurde zu lang für einen Kommentar ...

aus der Dokumentation für Hamcrest Lesen und REST Assured es scheint, wie equalTo nur true zurück in die Fälle, dass Object.equals kehrt true: bestimmt

[EqualTo] erzeugt eine Matcher, der das untersuchte Objekt übereinstimmt, wenn logisch gleich dem spezifizierten Operanden ist, indem die Object.equals (java.lang.Object) Verfahren auf der rufenden untersuchtes Objekt.

So REST Assured da steht für Werte als Schwimmer Gleitkomma und Double.equals kann nur true zurück, wenn das andere Objekt ein Double ist, ist es notwendig, eine float und kein verwenden double (wie der Eingang und in der sie verpackt ein Objekt).

Auch der Abschnitt der Schwimmer in die sich darauf verlassen docs scheint es gilt nur für Fließkommawerte anzuzeigen:

Gleitkommazahlen müssen mit einem Java „float“ primitiv verglichen werden.

Ich nehme an, dass bedeutet, dass ganze Zahlen richtig als Ganzzahlen dargestellt werden. (Weitere Beispiele in der Dokumentation scheint auch dies vorschlagen)

Wenn Sie ausgewählt haben Matchers.closeTo zu verwenden, anstatt equalTo oder is (die selbst equalTo nennt), dann sollte es keine Rolle, ob Sie eine double oder eine float verwenden.

+0

Ihre Antwort kam meiner Frage am nächsten, obwohl einige Ihrer Antworten nicht maßgeblich waren. Der wichtigste Punkt, den Sie hervorgebracht haben, ist, dass wenn ich 'Matcher.closeTo()' benutze (und das sollten wir sowieso verwenden), ist es egal, was der JSON-Parser ausgibt. –

0

Sie können viele Dinge mit hamcrest vergleichen.Matchers, wird es auch verwendet, in Test zu behaupten:

assertThat(longValue, equalTo(10L)); 
assertThat(cadena, equalTo("Esta es una cadena")); 

Es ist ein Vergleich zu Lang und String, und natürlich haben Sie die SchließenZum Dinge zu vergleichen, wie Doppel- oder BigDecimal, werfen Sie einen Blick here und there

So in der Tat, ist normal, die Überraschung, aber man kann auch gleich vergleichen wählen oder tun, wenn bequem

0

Sieht aus wie Sie zwei Dinge zusammen mischen.

Hat der JSON-Parser verwenden unterschiedliche Primitiven für integer und nicht ganzzahlige Werte?

Wertvergleich wird durch gegebenes Matcher-Objekt durchgeführt. Der angegebene Matcher hat auf keinen Fall einen Einfluss auf den Json Parser. Unabhängig davon, welchen Wert Sie dem Matcher (5 im ersten Beispiel) gegeben haben und welchen Wert der angegebene jsonpath zurückgeben würde, vergleicht der Equals-Matcher (org.hamcrest.core.IsEqual) beide Werte, indem er die Methode Objects.equals() aufruft. Auch Json Parser arbeitet mit Wertobjekte und nicht mit Primitiven.

also wie funktionierte 5 oben, was ein int und kein doppel ist?

Unter der Annahme, JsonPath lotto.lottoId würde int-Wert zurückgeben, wird somit body("lotto.lottoId", equalTo(5)); wahr sein

12.2' and 12.2f‘wie dieselben Werte in Ihrem Beispiel behandelt (natürlich json Wert 5 sein). Suffixing "f" in Ihrem Beispiel ist redundant und hat keine Auswirkungen. Da die Methode closeTo(double, double) die Argumenttypen als double definiert hat, werden die übergebenen Float-Werte implizit auf doppelte Typen hochgestuft.

Da Sie wissen, dass Sie json Wert gehen doppelt sein, so könnte man Ausdruck Ihre Behauptung als:

get("/price").then().body("price", closeTo(12.12, 0.01)); 

der Konfiguration Json Parser je, nicht-ganzzahligen Wert als BigDecimal gelesen werden kann, Wenn das der Fall ist, können Sie die Varianz von closeTo() als

.get("/price").then().body("price", 
      closeTo(BigDecimal.valueOf(12.12), BigDecimal.valueOf(0.01))) 

Hoffe, es hilft verwenden.

0

Wenn Sie sorgfältig Hamcrest lesen dann werden Sie feststellen, ist es klar gesagt „, wenn das untersuchte Objekt ist logisch gleich dem angegebenen Operanden“ für EqualTo. Also ist es natürlich egal, ob es "5" oder 5 ist! AND in Rest-Assured, Es wird erwähnt, dass equalTo und hasItems Hamcrest-Matcher sind, die Sie von org.hamcrest.Matchers statisch importieren sollten. Also ich glaube nicht, dass es irgendeine Verwirrung geben sollte.