Java >> Java Tutorial >  >> Java

WireMock-Tutorial:Einführung

Dieser Blogbeitrag gibt eine kurze Einführung in WireMock. Nachdem wir diesen Blogbeitrag fertiggestellt haben, können wir seine Hauptfunktionen identifizieren, wir wissen, wann wir ihn verwenden sollten, und wir können die erforderlichen Abhängigkeiten mit Maven und Gradle erhalten.

Fangen wir an.

Was ist WireMock?

WireMock ist ein Tool, das das Verhalten einer HTTP-API nachahmen und die an diese API gesendeten HTTP-Anforderungen erfassen kann. Es erlaubt uns:

  • Konfigurieren Sie die Antwort, die von der HTTP-API zurückgegeben wird, wenn sie eine bestimmte Anfrage erhält.
  • Erfassen Sie die eingehenden HTTP-Anforderungen und schreiben Sie Zusicherungen für die erfassten HTTP-Anforderungen.
  • Identifizieren Sie die gestubbten und/oder erfassten HTTP-Anforderungen mithilfe des Anforderungsabgleichs.
  • Konfigurieren Sie Anforderungsabgleicher, indem Sie die Anforderungs-URL, die Anforderungsmethode, die Anforderungsheader, Cookies und den Anforderungstext mit den erwarteten Werten vergleichen.
  • Verwenden Sie WireMock als Bibliothek oder führen Sie es als eigenständigen Prozess aus.

Als nächstes werden wir herausfinden, wann wir WireMock verwenden sollten.

Wann sollten wir WireMock verwenden?

Es gibt drei Situationen, in denen wir WireMock verwenden sollten:

Zuerst , müssen wir eine Funktion implementieren, die eine nicht fertige HTTP-API verwendet. Dies ist eine ziemlich häufige Situation, wenn wir eine Greenfield-Entwicklung durchführen und unsere Anwendung mit anderen Systemen (entweder intern oder extern) integrieren müssen, die nicht von uns geschrieben wurden. Wenn wir die Microservices-Architektur verwenden, stehen die Chancen gut, dass wir in ähnliche Situationen geraten.

Zweite , müssen wir Komponententests für Klassen schreiben, die HTTP-APIs verwenden. Wenn wir Unit-Tests für eine Klasse namens A schreiben die eine andere Klasse namens B verwendet die eine HTTP-API verwendet, ist das erste, was uns in den Sinn kommt, die B zu ersetzen mit einem Scheinobjekt, wenn wir Einheitentests für A schreiben Klasse.

Dies ist eine gute Wahl, wenn der API-Client (B class) wird von jemand anderem bereitgestellt, weil wir davon ausgehen können, dass der Autor des Clients dafür gesorgt hat, dass es richtig funktioniert. Wenn der API-Client jedoch von uns geschrieben wurde, ist die Verwendung eines Scheinobjekts keine gute Wahl, da wir damit nicht überprüfen können, ob unser Code mit der HTTP-API kommunizieren kann.

Tatsächlich denke ich, dass die beste Option darin besteht, beide A zu testen und B Klassen als eine Einheit. Auf diese Weise können wir überprüfen, ob die richtigen Informationen an die HTTP-API gesendet werden, und sicherstellen, dass alle "legalen" HTTP-Antworten von A verarbeitet werden können und B Klassen.

Dritter , müssen wir Integrations-, API- oder End-to-End-Tests für Funktionen schreiben, die externe HTTP-APIs verwenden. Wenn wir diese Art von Tests schreiben, wollen wir keine externen HTTP-APIs aufrufen, denn wenn unsere Tests eine externe HTTP-API aufrufen:

  • Unsere Tests sind von der externen HTTP-API abhängig . Das bedeutet natürlich, dass unsere Tests fehlschlagen, wenn die externe HTTP-API ausgefallen ist. Außerdem ist es sehr üblich, dass die externe HTTP-API es uns nicht erlaubt, sie in einen bekannten Zustand zu initialisieren, bevor unsere Tests ausgeführt werden. Aus diesem Grund können wir keine Tests schreiben, die die von der externen HTTP-API zurückgegebenen Daten verwenden, da wir nicht wissen können, welche Art von Daten zurückgegeben werden.
  • Unsere Tests sind langsamer als sie sein könnten . Die Sache ist die, dass das Warten auf eine Antwort von einer externen HTTP-API viel länger dauert, als dieselbe Antwort von WireMock zu erhalten. Erschwerend kommt hinzu, dass wir kein kurzes Timeout verwenden können, da sonst unsere Tests fehlschlagen könnten, nur weil das Timeout zu kurz war und es überschritten wurde.
  • Wir können unsere Tests nicht ausführen, wenn wir keine Netzwerkverbindung haben . Dies ist ein Problem, da es Orte gibt, an denen wir nicht unbedingt eine gute Netzwerkverbindung haben (wie in einem Zug). Außerdem blockieren einige APIs Anfragen, die nicht von einer „bekannten“ IP-Adresse stammen. Dies bedeutet, dass eine funktionierende Netzwerkverbindung möglicherweise nicht ausreicht. Wir müssen auch mit dem richtigen Netzwerk verbunden sein.

Mit anderen Worten, wenn wir keine langsamen und inkonsistenten Tests schreiben wollen, die nur ausgeführt werden können, wenn wir mit dem richtigen Netzwerk verbunden sind, sollten wir WireMock verwenden.

Tests, die WireMock verwenden, können nicht garantieren, dass unsere Anwendung mit den verwendeten HTTP-APIs kompatibel ist . Diese Tests können nur Folgendes sicherstellen:

  • Unsere Anwendung sendet die erwarteten Anfragen an die verwendete HTTP-API.
  • Unsere Anwendung funktioniert wie erwartet, wenn sie eine erwartete Antwort von der HTTP-API erhält.

Mit anderen Worten, wenn unsere Erwartungen nicht stimmen, sind diese Tests gefährlich, weil sie ein falsches Sicherheitsgefühl erzeugen. Aus diesem Grund müssen wir diese Funktionen immer manuell testen, bevor wir unsere Anwendung in der Produktionsumgebung bereitstellen .

Lassen Sie uns weitermachen und herausfinden, wie wir die erforderlichen Abhängigkeiten mit Maven und Gradle erhalten können.

Erforderliche Abhängigkeiten abrufen

Wir können die erforderlichen Abhängigkeiten erhalten, indem wir eine dieser beiden Abhängigkeiten in unserem Build-Skript deklarieren:

  • Der wiremock Abhängigkeit enthält nur WireMock.
  • Die wiremock-standalone Abhängigkeit ist ein Fat-Jar, das WireMock und alle seine Abhängigkeiten enthält.

Wir können die richtige Abhängigkeit auswählen, indem wir diese drei Regeln befolgen:

  • Die wiremock Abhängigkeit sollte unsere Standardauswahl sein.
  • Wenn wir WireMock als eigenständigen Prozess ausführen möchten, sollten wir den wiremock-standalone verwenden Abhängigkeit.
  • Wenn wir Spring Boot mit Jetty verwenden, sollten wir den wiremock-standalone verwenden Abhängigkeit, weil es uns hilft, einen Konflikt mit der Jetty-Version zu vermeiden.

Als nächstes werden wir herausfinden, wie wir diese Abhängigkeiten mit Maven und Gradle erhalten können.

Erforderliche Abhängigkeiten mit Maven erhalten

Wenn wir den wiremock verwenden wollen Abhängigkeit müssen wir das folgende Snippet zu unserer pom.xml hinzufügen Datei:

<dependency>
 <groupId>com.github.tomakehurst</groupId>
 <artifactId>wiremock</artifactId>
 <version>2.16.0</version>
 <scope>test</scope>
</dependency>

Wenn wir den wiremock-standalone verwenden wollen Abhängigkeit müssen wir das folgende Snippet zu unserer pom.xml hinzufügen Datei:

<dependency>
 <groupId>com.github.tomakehurst</groupId>
 <artifactId>wiremock-standalone</artifactId>
 <version>2.16.0</version>
 <scope>test</scope>
</dependency>

Erforderliche Abhängigkeiten mit Gradle erhalten

Wenn wir den wiremock verwenden möchten Abhängigkeit müssen wir das folgende Snippet zu unserer build.gradle hinzufügen Datei:

dependencies {
 testCompile(
 'com.github.tomakehurst:wiremock:2.16.0'
 )
}

Wenn wir den wiremock-standalone verwenden möchten Abhängigkeit müssen wir das folgende Snippet zu unserer build.gradle hinzufügen Datei:

dependencies {
 testCompile(
 'com.github.tomakehurst:wiremock-standalone:2.16.0'
 )
}

Wir können jetzt die Hauptfunktionen von WireMock identifizieren, wir verstehen, wann wir WireMock verwenden sollten, und wir können die erforderlichen Abhängigkeiten abrufen.

Fassen wir zusammen, was wir aus diesem Blogbeitrag gelernt haben.

Zusammenfassung

Dieser Blogbeitrag hat uns fünf Dinge beigebracht:

  • WireMock kann das Verhalten einer HTTP-API nachahmen und die an diese API gesendeten HTTP-Anforderungen erfassen.
  • WireMock ermöglicht es uns, eine Funktion zu implementieren, die eine nicht fertige HTTP-API verwendet.
  • WireMock ermöglicht es uns, schnelle und konsistente Tests zu schreiben.
  • Tests, die WireMock verwenden, können nicht garantieren, dass unsere Anwendung mit den verwendeten HTTP-APIs kompatibel ist.
  • Wir können die erforderlichen Abhängigkeiten erhalten, indem wir entweder den wiremock deklarieren oder wiremock-standalone Abhängigkeit in unserem Build-Skript.

Java-Tag