Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Citrus 2.0 - Automatisierte Integrationstests

Citrus 2.0 - Automatisierte Integrationstests

QS-Tag 2014

Avatar for Christoph Deppisch

Christoph Deppisch

November 06, 2014

More Decks by Christoph Deppisch

Other Decks in Technology

Transcript

  1. Hier soll der Titel rein Testorganisation State of the Art

    www.qs-tag.de Veranstalter: imbus AG www.qs-tag.de Citrus 2.0 Automatisierte Integrationstests Christoph Deppisch ConSol* Software GmbH
  2. Seite Agenda •  Begrüßung •  Mission: Integrationstest •  Framework Ziele

    •  Einstieg –  Testumgebung –  Aufbau –  Projekt Setup •  Beispielanwendung –  Testfall erstellen –  Nachrichten senden/empfangen –  Endpoints –  Test Variablen –  Nachrichten validieren –  Funktionen –  ValidationMatcher •  Java DSL •  Dynamische Endpoints •  Continuous Integration •  Fragen und Antworten 06. November 2014 www.consol.de 3
  3. Seite Mission: Integrationstest 06. November 2014 www.consol.de 5 App B

    App A Schnittstelle / Vertrag SOAP / WSDL Simulator ? Mock ?
  4. Seite Mission: Integrationstest 06. November 2014 www.consol.de 7 System Under

    Test Webclient Kunde Agent / Techniker Mobile, PDA Verträge Stammdaten Dienstleister Shipping
  5. Seite Historie 06. November 2014 www.consol.de 9 Spring à JMS

    à Http à SOAP à XML, XPath à REST, FTP à Mail à Camel à Vert.x Citrus 2.0 Version 1.1 – 1.4 Open Source ASL 2.0 Version 1.0 Version 0.1 - 0.9 2006 2009 2014
  6. Seite Ziele •  Automatisierte Schnittstellen Tests –  Versioniert –  Wiederholbar

    –  Verlässlich •  Ein Framework testet alle Schnittstellen –  Client- und serverseitig –  Http, SOAP, JMS, FTP, REST, XML JSON, CSV, ... –  1-n Schnittstellen in einem Testfall •  Continuous Integration –  Jenkins, Hudson –  JUnit / TestNG –  Maven / ANT 06. November 2014 www.consol.de 10
  7. Seite Ziele •  Kein Programmieraufwand –  Vorgefertigte Komponenten •  Senden

    und Empfangen •  Validieren und Verifizieren –  Keine Simulatoren, keine Mocks notwendig •  Keine verteilte Logik & Dokumentation •  Hohe Erweiterbarkeit –  Eigene Testaktionen erstellen –  Eigene Adapter (proprietäre Schnittstellen) –  Eigene Validatoren (z.B. Excel, EDIFACT) 06. November 2014 www.consol.de 11
  8. Seite Testumgebung 06. November 2014 www.consol.de 12 Build-Lifecycle Testumgebung Copy

    & Compile Code Änderung Citrus Integration Tests Unit Tests Package & Deploy Application Server Citrus Projekt Build-Tool (Maven) Code Versionierung (Git) Test Reporting Call Interfaces Checkout Sources Compile Package Deploy Execute Tests Verify results Create Reports DBMS Save Update Delete
  9. Seite Aufbau 06. November 2014 www.consol.de 13 Citrus Test Engine

    Endpoint Konfiguration Komponenten Java & Spring Framework Server Synchron Adapter Http Camel Utils Functions Matcher Validator XML JSON WSDL/XSD XPath Text Client Asynchron JMS SOAP Mail
  10. Seite Projekt Setup •  Citrus Projekt erstellen –  Maven • 

    Citrus als POM Dependency •  mvn integration-test –  Ant •  Download (http://citrusframework.org/download.html) •  ant run-tests •  Projektstruktur –  src/citrus/java à Java Klassen –  src/citrus/resources à Konfiguration –  src/citrus/tests à Testfälle (XML) 06. November 2014 www.consol.de 14
  11. 16 Seite Beispielanwendung •  Incident-Manager –  JEE Anwendung mit diversen

    Schnittstellen •  Kunde, Netzwerk Backend, FieldForce, SMS Gateway •  Typischer Use Case –  Kunde gibt Störung auf –  Vorgang zur Störung wird erstellt –  Problemanalyse in der Netzwerk Backend-Anwendung –  Je nach Analyseergebnis wird ein Techniker im FieldForce angefordert, der vor Ort die Behebung des Problems vornimmt –  Nach Behebung des Problems wird die Störung abgeschlossen und der Kunde per SMS benachrichtigt www.consol.de
  12. 17 Seite Beispielanwendung 06. November 2014 www.consol.de Kunde SMS Gateway

    FieldForce Service Incident-Manager Network Backend JMS/XML Http/SOAP Http/SOAP Http/XML SMS Versandt Vorort Service
  13. 19 Seite Beispielanwendung 06. November 2014 www.consol.de Kundencenter IncidentM Network

    FieldForce SMS OpenIncidentRequest AnalyseIncidentRequest AnalyseIncidentResponse OrderRequest OrderNotification SendSmsRequest IncidentOrderResponse SendSmsResponse
  14. 22 Seite Citrus Testfall •  Java Klasse –  JUnit oder

    TestNG Test –  Ausführungseinheit (Maven, ANT, Jenkins, ...) –  Kann von Citrus generiert werden 06. November 2014 www.consol.de package com.consol.citrus.samples; import org.testng.annotations.Test; import com.consol.citrus.annotations.CitrusXmlTest; import com.consol.citrus.testng.AbstractTestNGCitrusTest; /** Sample Citrus integration test */ @Test public class SampleTest extends AbstractTestNGCitrusTest { @CitrusXmlTest(name="FirstSampleITest") public void firstSampleITest() { } }
  15. 23 Seite Citrus Testfall •  XML Testfallbeschreibung 06. November 2014

    www.consol.de <testcase name="FirstSampleITest"> <meta-info> <author>Christoph Deppisch</author> <creationdate>2014-11-06</creationdate> <status>DRAFT</status> <last-updated-by>Christoph Deppisch</last-updated-by> <last-updated-on>2013-11-14T00:00:00</last-updated-on> </meta-info> <description>This is a sample test case</description> <actions> <echo> <message>TODO: Code the test!</message> </echo> <!-- Test actions go in here --> [...] </actions> </testcase>
  16. 25 Seite Testaktionen •  Testfall besteht aus 1-n Testaktionen • 

    Erweiterbarkeit um eigene Testaktionen! www.consol.de Name Beschreibung Name Beschreibung send Versenden einer Nachricht sql SQL Abfragen ausführen receive Empfang einer Nachricht sleep Zeitspanne warten echo Text ausgeben create-varaibles Testvariable(n) erstellen java Java Code ausführen iterate Schleife groovy Groovy Code ausführen repeat-until-true Schleife mit Bedingung input Benutzereingabe repeat-onerror-until-true Fehlerschleife assert Ausnahme erwarten parallel Parallele Ausführung catch Ausnahme abfangen sequential Sequentielle Ausführung ant ANT Skript ausführen conditional Bedingte Ausführung
  17. 26 Seite Nachrichten senden •  Send Message Testaktion –  Payload

    und Header Informationen 06. November 2014 www.consol.de <send endpoint="helloRequestJmsEndpoint"> <message> <data> <![CDATA[ <HelloRequest xmlns="http://consol.de/schemas/HelloService.xsd"> <MessageId>${messageId}</MessageId> <CorrelationId>${correlationId}</CorrelationId> <User>${user}</User> <Text>Hello Citrus</Text> </HelloRequest> ]]> </data> </message> <header> <element name="Operation" value=“sayHello"/> <element name="CorrelationId" value="${correlationId}"/> </header> </send>
  18. 27 Seite Nachrichten empfangen •  Receive Message Testaktion –  Erwartete

    Payload und Header Informationen 06. November 2014 www.consol.de <receive endpoint="helloResponseJmsEndpoint"> <message> <data> <![CDATA[ <HelloResponse xmlns="http://consol.de/schemas/HelloService.xsd"> <MessageId>${messageId}</MessageId> <CorrelationId>${correlationId}</CorrelationId> <User>${user}</User> <Text>Hello User</Text> </HelloResponse> ]]> </data> </message> <header> <element name="Operation" value=“sayHello"/> <element name="CorrelationId" value="${correlationId}"/> </header> </receive>
  19. 28 Seite Endpoints •  Citrus Endpoints –  Fertige Komponenten -

    nur Konfiguration notwendig! –  citrus-jms, citrus-http, citrus-ws, citrus-mail, citrus-camel, ... 06. November 2014 www.consol.de <!– HelloService JMS endpoints --> <citrus-jms:endpoint id="helloRequestJmsEndpoint" destination-name="JMS.HelloService.Request.Queue"/> <citrus-jms:endpoint id="helloResponseJmsEndpoint" destination-name="JMS.HelloService.Response.Queue"/> <!-- SOAP web service client --> <citrus-ws:client id="helloSoapClient" request-url="http://localhost:8080/test"/> <!– SOAP web server --> <citrus-http:server id="helloSoapServer" port="18080" auto-start="true" resource-base="src/citrus/resources"/>
  20. 30 Seite Test Variablen •  Platzhalter definieren •  Vorteile – 

    Dynamische Werte •  Funktionen –  Bessere Wartbarkeit von Testfällen •  Globale Variablen •  Testvariationen durch unterschiedliche Werte –  Bessere Lesbarkeit von Testfällen 06. November 2014 www.consol.de <variables> <variable name="correlationId" value=“CORR_123456789"/> <variable name="shippingDate" value="citrus:currentDate()"/> <variable name="name" value="TestUser"/> </variables>
  21. 31 Seite Test Variablen •  Variablen referenzieren –  Direkt im

    Nachrichten Payload, Header, ... 06. November 2014 www.consol.de <send endpoint="helloRequestJmsEndpoint"> <message> <data> <![CDATA[ <HelloRequest xmlns="http://consol.de/schemas/HelloService.xsd"> <MessageId>${messageId}</MessageId> <CorrelationId>${correlationId}</CorrelationId> <User>${user}</User> <Text>Hello Citrus</Text> </HelloRequest> ]]> </data> </message> <header> <element name="Operation" value="sayHello"/> <element name="CorrelationId" value="${correlationId}"/> </header> </send>
  22. 32 Seite Nachrichten validieren •  Erwartete Nachrichteninhalte definieren –  Innerhalb

    einer Receive Aktion –  Schema Validierung •  XSD, WSDL –  Semantische Template Validierung •  Header & Payload 06. November 2014 www.consol.de Message Header Control Header Message Payload Control Payload Vergleich
  23. 33 Seite Nachrichten validieren •  XML –  DOM Tree Vergleich

    •  Elemente, Attribute, Namensräume –  XPath •  Ausdrücke auswerten und vergleichen •  JSON –  JSON Array, JSON Objekte –  Reihenfolge der Elemente nicht vorgegeben •  SQL Abfrageergebnis –  Zeilen und Spalten des ResultSets –  Groovy Skriptvalidierung 06. November 2014 www.consol.de
  24. 34 Seite Nachrichten validieren •  XHTML/HTML –  HTML Markup vergleichen

    •  Elemente, Attribute •  Text, CSV –  Textvergleich •  Binärdaten –  Hexadezimal base64 Zeichenketten –  BinaryToHex64 •  Erweiterbarkeit um eigene Validatoren! 06. November 2014 www.consol.de
  25. 35 Seite Nachrichten validieren •  Inline CDATA 06. November 2014

    www.consol.de <receive endpoint="helloResponseJmsEndpoint"> <message> <data> <![CDATA[ <HelloResponse xmlns="http://consol.de/schemas/HelloService.xsd"> <MessageId>${messageId}</MessageId> <CorrelationId>${correlationId}</CorrelationId> <User>${user}</User> <Text>Hello Citrus</Text> </HelloResponse> ]]> </data> </message> <header> <element name="Operation" value=“sayHello"/> <element name="CorrelationId" value="${correlationId}"/> </header> </receive>
  26. 36 Seite Nachrichten validieren •  Externe Datei •  XPath 06.

    November 2014 www.consol.de <receive endpoint="helloResponseJmsEndpoint"> <message> <resource file="classpath:com/consol/citrus/sample/helloRequest.xml" /> </message> <header> <element name="Operation" value=“sayHello"/> <element name="CorrelationId" value="${correlationId}"/> </header> </receive> <receive endpoint="helloResponseJmsEndpoint"> <message> <validate path="//HelloResponse/CorrelationId" value="${correlationId}"/> <validate path="//HelloResponse/Text" value="Hello Citrus"/> </message> </receive>
  27. 37 Seite Nachrichten validieren •  Groovy Skript •  Verschiedene Groovy

    Validatoren in Citrus –  XML –  JSON 06. November 2014 www.consol.de <receive endpoint="helloResponseJmsEndpoint"> <message> <validate> <script type="groovy"> Assert.assertTrue(root.CorrelationId == '${correlationId}') Assert.assertEquals(root.Text, 'Hello Citrus') </script> </validate> </message> </receive>
  28. 39 Seite Funktionen •  Erstellen von dynamischen Inhalten 06. November

    2014 www.consol.de <variables> <variable name="correlationId" value="citrus:randomString(10)"/> <variable name="shippingDate" value="citrus:currentDate()"/> <variable name="messageId" value="citrus:randomNumber(4)"/> </variables> <receive endpoint="helloResponseJmsEndpoint"> <message> <data> <![CDATA[ <HelloResponse xmlns="http://consol.de/schemas/HelloService.xsd"> <MessageId>citrus:randomNumber(4)</MessageId> <CorrelationId>citrus:randomString(10)</CorrelationId> <User>${user}</User> <Text>Today is citrus:currentDate()</Text> </HelloResponse> ]]> </data> </message> </receive>
  29. 40 Seite Funktionen •  Citrus Funktionen (Prefix à citrus:) • 

    Erweiterbarkeit um eigene Funktionen! 06. November 2014 www.consol.de Name Beschreibung Name Beschreibung citrus:randomString() Zufällige Zeichenkette citrus:currentDate() Aktuelles Datum citrus:randomNumber() Zufällige Zahl citrus:upperCase() Zeichenkette Groß citrus:concat() Texte zusammenführen citrus:lowerCase() Zeichenkette Klein citrus:substring() Teil einer Zeichenkette citrus:minimum() Minimum citrus:substringAfter() Ende einer Zeichenkette citrus:maximum() Maximum citrus:substringBefore() Anfang einer Zeichenkette citrus:absolute() Absolute Zahl citrus:stringLength() Länge Zeichenkette citrus:mapValue() Mapping Key-Value citrus:sum() Summe citrus:randomEnumValue() Zufälliger Wert aus Liste citrus:average() Durchschnittswert ...
  30. 41 Seite Validation Matcher •  Dynamischer Vergleich von Werten – 

    Einsatz bei Empfang und Validierung einer Nachricht 06. November 2014 www.consol.de <receive endpoint="helloResponseJmsEndpoint"> <message> <data> <![CDATA[ <HelloResponse xmlns="http://consol.de/schemas/HelloService.xsd"> <MessageId>@greaterThan(1)@</MessageId> <CorrelationId>@startsWith('CORR')@</CorrelationId> <User>${user}</User> <Text>@contains('foo')@</Text> </HelloResponse> ]]> </data> </message> </receive>
  31. 42 Seite Validation Matcher •  Citrus Validation Matcher •  Erweiterbarkeit

    um eigene Validation Matcher! 06. November 2014 www.consol.de Name Beschreibung Name Beschreibung @contains()@ Zeichenkette enthalten @matches()@ Prüft regulären Ausdruck @containsIgnoreCase()@ Zeichenkette enthalten @matchesDatePattern()@ Prüft Datumsformat @equalsIgnoreCase()@ Groß- Kleinschreibung @lowerThan()@ Zahl kleiner als @matchesXML()@ XML Vergleich @greaterThan()@ Zahl größer als @startsWith()@ Beginnt mit Zeichenkette @isNumber()@ Numerischer Wert @endsWith()@ Endet mit Zeichenkette ...
  32. 44 Seite Java DSL •  Domain Specific Language –  Sprechende

    Syntax –  Nur Java Code – kein XML notwendig! –  Vererbung von Klassen –  Behavior Pattern 06. November 2014 www.consol.de Java Test XML
  33. 45 Seite Java DSL •  Java Klasse enthält Testfall Logik

    •  @CitrusTest Java Annotation 06. November 2014 www.consol.de import org.testng.annotations.Test; import com.consol.citrus.dsl.TestNGCitrusTestBuilder; public class MyFirstTest extends TestNGCitrusTestBuilder { @CitrusTest(name="JavaDslTest") public void test() { description("This is a Test"); variable("text", "Hello World!"); echo("Hello Citrus!"); echo("${text}"); }
  34. 46 Seite Java DSL 06. November 2014 www.consol.de @CitrusTest(name="JavaDslTest") public

    void test() { description("This is a Test"); variable("text", "Hello World!"); echo("Hello Citrus!"); echo("${text}"); } <testcase name="MyFirstTest"> <description>This is a Test</description> <variables> <variable name="text" value="Hello World!"/> </variables> <actions> <echo> <message>Hello Citrus!</message> </echo> <echo> <message>${test}</message> </echo> </actions> </testcase>
  35. 48 Seite Dynamische Endpoints •  Erleichterung für schnelle Testfallerstellung – 

    Keine Citrus Komponente in der Konfiguration notwendig –  Komponente wird zur Laufzeit erstellt www.consol.de <send endpoint="jms:JMS.Hello.Queue"> <message type="plaintext"> <data>Hello from Citrus!</data> </message> </send> <receive endpoint="jms:JMS.Hello.Queue?timeout=5000"> <message type="plaintext"> <data>Hello from Citrus!</data> </message> </receive>
  36. 49 Seite Dynamische Endpoints 06. November 2014 www.consol.de <send endpoint="http://localhost:8080/test">

    <message type="plaintext"> <data>Hello from Citrus!</data> </message> </send> <receive endpoint="http://localhost:8080/test"> <message type="plaintext"> <data>Hello from Citrus!</data> </message> </receive> <send endpoint="camel:direct:news"> <message type="plaintext"> <data>Hello from Citrus!</data> </message> </send> <receive endpoint="camel:direct:news"> <message type="plaintext"> <data>Hello from Citrus!</data> </message> </receive>
  37. 50 Seite Dynamische Endpoints •  Übergabe von Parametern möglich 06.

    November 2014 www.consol.de jms:queuename jms:topic:topicname jms:queuename?connectionFactory=specialConnectionFactory&timeout=10000 jms:topic:topicname?connectionFactory=topicConnectionFactory jms:sync:queue?connectionFactory=connection&replyDestination=replyQueue http://localhost:8088 http://localhost:8088?requestMethod=GET&timeout=1000&requestFactory=myFactory http://localhost:8088/test?requestMethod=GET&customParam=foo soap:localhost:8088?timeout=10000&messageFactory=myMessageFactory camel:direct:routeId camel:seda:routeId camel:jms:queue:someQueue?connectionFactory=myConnectionFactory camel:activemq:queue:inboundQueue?concurrentConsumers=5 camel:controlbus:route?routeId=myRoute&action=status
  38. 52 Seite Continuous Integration •  Continuous Integration Tools –  Jenkins

    –  Hudson –  Bamboo •  Ausführung der Schritte –  Checkout –  Compile –  Unit Test –  Package –  Deploy –  Integration-Test www.consol.de
  39. 53 Seite Continuous Integration •  Ausführen der Citrus Tests – 

    Maven Build –  ANT Build •  Testergebnisse als JUnit reports –  Mail an Development Team verschicken •  Artefakte sichern •  Auf Feedback Zeiten achten! www.consol.de
  40. 55 Seite Zusammenfassung •  Ziele –  Automatisierte Integrationstests –  Einfach

    Schnittstellen simulieren und testen –  Kein Programmieraufwand –  Gängige Nachrichtenprotokolle unterstützen –  Erweiterbarkeit •  Ausblick –  Web Oberfläche zur Administration –  FTP Server –  LDAP Server www.consol.de
  41. 56 Seite Informationen •  Homepage • http://citrusframework.org •  Tutorials •

    http://citrusframework.org/tutorials.html •  User Guide • http://citrusframework.org/reference/html/index.html •  Mailing List • [email protected] •  Twitter • @citrus_test •  Blog • http://labs.consol.de/tags/citrus/ 06. November 2014 www.consol.de
  42. Seite 58 06. November 2014 www.consol.de ConSol* Software GmbH Franziskanerstraße

    38 D-81669 München Tel: +49-89-45841-100 Fax: +49-89-45841-111 [email protected] www.consol.de