© BIRTHPIX/Shutterstock.com
Mit dem Citrus Simulator komplexe Systeme nachbilden

Komplexes simulieren


Heterogene Softwarelandschaften setzen sich neben den intern entwickelten Softwarelösungen aus sehr vielen Fremd- bzw. Drittanbietersystemen zusammen. In Zeiten von Microservices schnellt die Anzahl von Abhängigkeiten zu anderen Systemen in die Höhe. Die Interaktion mit diesen Systemen sollte als Teil von automatisierten Integrations- bzw. End-to-End-Tests getestet und verifiziert werden. Viele Systeme bieten aber keine Testinstanzen.

Selbst wenn Testsysteme zur Verfügung stehen, lassen sie sich nur mühsam und mit viel Aufwand konfigurieren. In diesem Kontext wollen End-to-End-Tester Testszenarien selbst definieren und aus Sicht des Fremdsystems triggern. Weiterhin wünschen sich Entwickler eine Unabhängigkeit von externen Systemen, die zum Teil noch im Aufbau sind, aber während der eigenen Entwicklungsphase bereits benötigt werden. An diesem Punkt kommt der Citrus Simulator ins Spiel. Mit dessen Hilfe lassen sich individuelle Simulatoren erstellen, die komplexe Systeme mit vielfältigen Schnittstellen nachbilden können. Der Citrus Simulator ist eine Spring-Boot-Standalone-Webanwendung, die diverse Kommunikationsprotokolle wie REST, SOAP und JMS unterstützt. Er wurde auf Basis des Testframeworks Citrus entwickelt und profitiert damit von etablierten Features des Testtools, beispielsweise der Nachrichtenvalidierung. Der Simulator bietet eine generische Benutzeroberfläche, über die sich der Anwender die bestehenden Simulatorszenarien anzeigen lassen kann. Der Benutzer hat die Möglichkeit, eigenständig Nachrichten zu generieren, zu verschicken und so Testfälle aus Sicht des simulierten Systems auszulösen. Vorgefertigte Maven-Projekte für das Simulieren einer REST-, JMS- und SOAP-Schnittstelle erlauben den schnellen Einstieg.

Um die Hauptfeatures des Citrus Simulators vorzustellen, werden wir uns eine sehr vereinfachte Version einer Schnittstelle aus dem Telekommunikationsbereich anschauen. Diese definiert den Prozess für den automatisierten Wechsel zwischen verschiedenen Dienstanbietern. Die Schnittstelle ist SOAP-basiert, synchron und bidirektional. Das Sequenzdiagramm in Abbildung 1 veranschaulicht den üblichen Ablauf.

maher_todorov_citrussimulator_1.tif_fmt1.jpgAbb 1: Vereinfachter Ablauf einer Portierungsverhandlung

Szenarien spielen die Hauptrolle

Beide am Prozess beteiligten Parteien können sowohl als aufnehmender als auch als abgebender Dienstanbieter im jeweiligen Anwendungsfall agieren. Die zentrale Komponente im Citrus Simulator ist das Szenario. Verschiedene Szenarien enthalten eine unterschiedliche Logik und reagieren auf eingehende Request-Nachrichten mit der jeweiligen Response. Jedes Szenario kann Nachrichten empfangen, validieren, eine komplexe Logik implementieren und entsprechende Antworten zurückschicken. Mithilfe der Annotation @Scenario lässt sich dem Szenario ein Name geben, der eindeutig sein muss.

Als Erstes werden wir ein Szenario implementieren, das unabhängig von der eingegangenen Nachricht immer eine positive Empfangsbestätigung schickt (Listing 1).

Listing 1: Szenario für das Senden einer positiven Empfangsbestätigung

@Scenario("Acknowledgement") public class Acknowledgement extends AbstractSimulatorScenario { @Override public void run(ScenarioDesigner scenario) { scenario.echo("Receiving porting request or response ..."); scenario .receive() .header(SoapMessageHeaders.SOAP_ACTION, SoapActions.SEND_NEGOTIATION_REQUEST_ACTION) .extractFromPayload("//requestId", REQUEST_ID); scenario.echo("Sending acknowledgement for request with id '${requestId}' ..."); scenario .send() .payload("<env:Acknowledgement xmlns:env=\"http://www.citrusframework.org/simulator/porting/envelope\">\n" + " <status>OK</status>\n" + " <text></text>\n" + "</env:Acknowledgement>"); } }

Wer schon Erfahrung mit dem Citrus Framework hat, wird die Java-DSL-Syntax für die Testerstellung in Citrus erkennen. Die Citrus Java DSL bietet ein Fluent-API für das Senden und Empfangen von Nachrichten auf unterschiedlichen Transportwegen. Das abgebildete Szenario wartet initial auf eine eingehende Nachricht, die anhand der Receive-Methode empfangen und automatisch von Citrus validiert wird. Über die Send-Methode wird das Acknowledgement zurückgeschickt. Somit haben wir unser erstes Simul...

Neugierig geworden? Wir haben diese Angebote für dich:

Angebote für Gewinner-Teams

Wir bieten Lizenz-Lösungen für Teams jeder Größe: Finden Sie heraus, welche Lösung am besten zu Ihnen passt.

Das Library-Modell:
IP-Zugang

Das Company-Modell:
Domain-Zugang