testing microservices with a citrus twist

36
@citrus_test #Devoxx #CitrusTwist Testing Microservices with a Citrus Twist Christoph Deppisch ConSol* Software GmbH

Upload: christophd

Post on 12-Apr-2017

1.065 views

Category:

Technology


3 download

TRANSCRIPT

Page 1: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Testing Microservices with a Citrus Twist

Christoph Deppisch ConSol* Software GmbH

Page 2: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Christoph Deppisch

• Senior software developer

• @ConSol* Munich, Germany

• 10 years of experience in Java

• Passionate about automated software testing

• Founder of the Open Source framework Citrus

• Happy to be here today! Twitter: @freaky_styley

Page 3: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

What is Citrus?

• Open Source integration test framework

• Focus on messaging in distributed software systems

• Automated interface tests

• Ready-to-use endpoint components for message exchange

• Works & integrates with well-known libraries

• TestNG, JUnit

• Apache Camel, Spring, Docker, Arquillian …

Page 4: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Integration

Page 5: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Every project needs integration tests!

Page 6: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Service A Service BInterface

REST, JMS, File, SOAP

Page 7: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Service A Service BInterface

REST, JMS, File, SOAP

Mock?Simulator?

Page 8: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Service AInterface

REST, JMS, File, SOAP

Page 9: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Microservices

Page 10: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Service

Service

Service

Service

Service

ServiceServiceService

External

External

Page 11: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Continuous Delivery

Page 12: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Automation!

Page 13: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Citrus integration twist

Page 14: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

import com.consol.citrus.annotations.CitrusTest; import com.consol.citrus.dsl.testng.TestNGCitrusTestDesigner; import org.testng.annotations.Test;

@Testpublic class SampleCitrusIT extends TestNGCitrusTestDesigner { @CitrusTest public void sayHello() { echo("Hello, Devoxx! This is my first Citrus test!"); } }

Page 15: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Test actions

Page 16: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

• Missing something? Adding custom actions is possible!

Test actionsTest action Description

echo Log message to consolesend Sends a message

receive Receives a messagesleep Wait some time

sql Execute SQL statementsparallel Execute actions in parallel

conditional Execute actions based on conditioniterate Execute actions in iteration

repeat-on-error Failsafe action execution…

Page 17: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

@Testpublic class MessageExchangeIT extends TestNGCitrusTestDesigner { @Autowired private Endpoint orderEndpoint; @CitrusTest public void sendAndReceiveMessage() { send(orderEndpoint) .payload("...");

receive(orderEndpoint) .payload("..."); } }

Page 18: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

@CitrusTestpublic void sendAndReceiveMessage() { variable("orderId", Functions.randomNumber(10L));

send(orderEndpoint) .payload("<order>" +

"<id>${orderId}</id>" + "</order>") .header("operation", "placeOrder") .header("id", "${orderId}");

receive(orderEndpoint) .payload("<orderResponse>" + "<timestamp>@ignore@</timestamp>" + "<id>${orderId}</id>" + "<success>true</success>" + "</orderResponse>") .header("id", "${orderId}"); }

Page 19: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Endpoints

Page 20: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

• Missing something? Adding custom components is easy!

Endpoint componentsComponent Descriptioncitrus-http Http REST client and servercitrus-jms JMS queue or topic destinationcitrus-ws SOAP client and server

citrus-mail SMTP mail client and servercitrus-docker Docker container managementcitrus-camel Apache Camel endpoint

citrus-ftp FTP client and servercitrus-vertx Vert.x endpointcitrus-ssh SSH client and server

Page 21: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

<!-- JMS endpoints --> <citrus-jms:endpoint id="orderEndpoint" destination-name="factory.order.inbound"/> <citrus-jms:sync-endpoint id="errorEndpoint" destination-name="base.error.service" timeout="${global.receive.timeout}"/>

<!-- JMS connection factory and message broker --><bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> <property name="brokerURL" value="tcp://localhost:61616" /></bean>

Endpoints: citrus-jms

Page 22: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

<!-- REST Http client --> <citrus-http:client id="reportingClient" request-method="GET" timeout="5000" request-url="http://localhost:8080/services/report"/>

<!-- REST Http server --><citrus-http:server id="reportingServer" port="8080" auto-start="true"/>

Endpoints: citrus-http

Page 23: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Example

Page 24: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Cookie factory sample

worker

worker

worker

webapp reporting2x 4x 1x

Page 25: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Docker infrastructure

brokerwebapp report

worker

worker

worker

Page 26: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

brokerwebapp report

worker

worker

worker

Page 27: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Demo

Page 28: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Demo tools

• docker-maven-plugin

• docker:build, docker:start, docker:stop

• https://github.com/rhuss/docker-maven-plugin

• Apache Camel

• Content-based routing, REST endpoints, standalone worker

• http://camel.apache.org/

• Demo Code

• https://github.com/christophd/citrus-demo-devoxx

Page 29: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

brokerwebapp report

worker

worker

worker

Page 30: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

brokerwebapp report

Page 31: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

broker

worker

worker

worker

Page 32: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

brokerwebapp report

Page 33: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

What else?

Page 34: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

What else!?

• Docker integration

• build, start, stop, inspect, …

• Manage Docker containers at test runtime

• Arquillian extension

• Use Citrus in Arquillian test

• @CitrusFramework, @CitrusEndpoint, @CitrusResource

• Apache Camel integration

• Create, start, stop routes at test runtime

Page 35: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Information

• Homepage • http://citrusframework.org

• Blog • http://labs.consol.de/tags/citrus/

• User Guide • http://citrusframework.org/reference/html/index.html

• Mailing List • [email protected]

Page 36: Testing Microservices with a Citrus twist

@citrus_test#Devoxx #CitrusTwist

Questions!?