Wie simuliere ich eine REST-API?

13

Ich arbeite an einem neuen Projekt, das Daten von einer REST-API eines Drittanbieters abfragt. Dies ist für einen Echtzeit-Sportdaten-Feed gedacht, sodass der Feed nur funktioniert, wenn tatsächlich ein Spiel stattfindet.

Obwohl die Drittanbieter eine gute Dokumentation (XSD usw.) bereitstellen, haben sie keine Möglichkeit, ein Spielgeschehen zu simulieren. Um den Code zu testen, den ich mit dieser API geschrieben habe, müsste ich warten, bis ein tatsächliches Spiel stattfindet.

Ich kann nur Code schreiben, um ein Spiel selbst zu simulieren, aber es scheint eine Menge Arbeit zu sein. Wie würden Sie das angehen?

Dferraro
quelle
5
Wie komplex sind diese Daten? Ich würde in den meisten Fällen nur die Objekte stummschalten, die die eingehenden Daten verarbeiten. Verwenden Sie entweder Daten aus früheren Spielsitzungen (möglicherweise zu komplex zum Testen) oder analysieren Sie die Daten und extrahieren Sie die relevanten Arten von Informationen. Speichern Sie dies in Dateien und übertragen Sie es in Ihr Hauptprogramm, als ob es von der eigentlichen Quelle stammen würde.
thorsten müller
2
Perfekter Anwendungsfall für ein Scheinobjekt. Http://en.wikipedia.org/wiki/Mock_object
Kevin Cline

Antworten:

15

Dies ist der perfekte Anwendungsfall für ein Scheinobjekt . Es gibt Spottbibliotheken für jede populäre Sprache. Sie möchten das Objekt verspotten, das die REST-Serviceantworten zum Zurückgeben von Testdaten bereitstellt. Sie können die Testdaten entweder manuell generieren oder sie aus früheren Aufrufen des Live-Systems erfassen.

Kevin Cline
quelle
1
Hier geht es nicht so sehr um Code. Es geht um Daten. Ich kann die API-Mocks oder -Stubs verspotten, aber das Problem besteht darin, falsche Daten zu erstellen, die mir
angezeigt werden
@dferraro: Was hindert Sie daran, den Dienst beim nächsten Spiel abzufragen und diese Daten in eine Datei zu kopieren? Sobald Sie dazu in der Lage sind und mit dem Format vertraut sind, können Sie eine neue Datei (oder Dateien) mit bestimmten Testfällen erstellen.
Steven Evers
4

Warten Sie, bis ein Spiel stattfindet. Erfassen Sie jedes Ereignis aus dem Feed. Schreiben Sie einen Simulator, der die Ereignisse zu den entsprechenden Zeiten wiederholt . Voila, du hast einen Futtersimulator mit echten Daten.

AakashM
quelle
Wenn Sie ein Ruby-Benutzer sind, können Sie den Videorecorder zum Erfassen und Wiedergeben der HTTP-Antworten verwenden.
7.
2

Ich empfehle Ihnen, Ihren eigenen Simulator zu schreiben. Sie können damit alle möglichen Szenarien testen.

  • Der Server akzeptiert die Verbindung, antwortet jedoch nicht
  • Server läuft ab
  • Server sendet Müllantwort usw. zurück ...

Wenn ich dies in der Vergangenheit getan habe, habe ich "spezielle" Werte in den Anforderungsnachrichten verwendet, um den Simulator aufzufordern, das zu tun, was ich brauche. Auf diese Weise können Sie auch End-to-End-Tests ausführen, ohne Ihre Entwicklungsumgebung zu verlassen.

Bearbeiten: Wenn Ihr Projekt beispielsweise XML an einen Drittanbieterdienst sendet, enthält die Anforderung möglicherweise z <value>50.00</value>. Der Simulator kann so codiert (oder besser so konfiguriert) werden, dass 50.00 => explodieren, 60.00 => Müll, 70.00 => Verbindung schließen und so weiter. Die Idee ist, dass das Verhalten des Simulators von seiner Eingabe abhängt, die Sie in jedem Testfall steuern.

Rory Hunter
quelle
Vielen Dank. Können Sie ein Beispiel geben, was Sie mit "besonderen" Werten meinen?
Dferraro
1
Ausarbeitung meiner Antwort.
Rory Hunter
2

In Anbetracht der Tatsache, dass der Buchmacher möglicherweise einige Beispieldaten bereitstellt (und diese während der Integrationsphase gespeichert werden können), empfehle ich, diese Feeds folgendermaßen zu organisieren:

  • Liste der Ereignisse
  • Updates für geplante Ereignisse
  • Quoten-Updates
  • Ergebnisse

Wahrscheinlich bietet der Anbieter zwei Arten von Updates an: Push (POST) und Pull (GET).

An diesem Punkt sollten Sie

  1. Erstellen Sie einen einfachen Server, der nur GET-Anforderungen verarbeitet, damit Ihre Programmierer Algorithmen ausarbeiten können.
  2. Erstellen Sie eine Automatisierung, um die Übermittlung der gleichen Informationen zu verwalten und so Ihr System zu belasten.

Verwalten Sie die Entwicklung und das Testen

Ohne auf die Details der zu verwendenden Technologie eingehen zu müssen, erhalten Sie einen Mini-Server , der nur auf 4 URLs reagiert (oder die, die je nach Anbieter erforderlich sind), und einen Mini-Push-Dienst .

Eine sehr gute Sache, die Sie bei der Arbeit mit dem "Mini-Server" beachten sollten, sind die Handler des HTTP-Protokolls. Das Erstellen eines Servers an Port 80 ist sehr einfach und löst das Problem. Sie müssen sicherstellen, dass Sie alle Informationen in die Antworten einfügen, die GET vom Anbieter erstellt hat (dies vermeidet Probleme bei der Inbetriebnahme).

Persönlich würde ich einen einfachen Perl-Server oder den gleichen aber mit Nodejs machen. Im Hinblick auf die Einspeisung von Daten wird ein Timer ausreichen, der einen Offline-Browser ( CURL , WGET ) aufruft.

marcocs
quelle
2

Ich habe die REST-API mithilfe einer Kombination aus cucumberjs und phantomjs simuliert, wobei der Proxy-Server auf 127.0.0.1 gesetzt und ein node.js-Prozess mit http-proxyund verknüpft wurdenock dort zu . CucumberJS ist nicht der wichtige Teil, Sie können Testszenarien auf jede Art und Weise schreiben, der Rest ist der Schlüssel zur Simulation. Es ist in der Lage, einfach durch Match-Request-Return-Daten zu verspotten, aber Sie können auch nach Mustern und Hook-Callback-Funktion filtern, um eine Antwort zu erstellen, so dass Sie jeden Grad an Granularität simulieren können, den Sie benötigen (im Extremfall mit a vollständiger Demo-Server, aber Sie können dies schrittweise tun).

Es funktioniert gut:

  1. Phantomjs fordern eine URI an.
  2. Die Anforderung wird am 127.0.0.1:port an den Proxyserver gesendet.
  3. Ihr node.js-Prozess leitet Proxys transparent weiter, indem er verwendet http-proxy. So funktioniert jedes "normale" Laden (Seiten, Bilder).
  4. Wenn Sie sich dafür entscheiden, einige Anforderungen (hauptsächlich API) abzufangen, verwenden Sie nockdiese.

In meinem Szenario habe ich es in demselben Prozess mit js-Tests für Gurken kombiniert.

  1. Testläufe.
  2. Es richtet nockHTTP-Mocking für das getestete Szenario ein.
  3. Es lädt eine Seite in Phantombildern über das Selenium-Protokoll.

Der Rest ist wie oben in diesem Abschnitt gezeigt (das heißt, es ist ein kleiner Zyklus, ich als Testläufer befehle Phantomjs, eine Seite zu laden, die alle Anfragen an mich zurückleitet, und ich leite sie an das Netz weiter oder fange ab sie, wenn es die getestete API ist).

herby
quelle