Resilience testing with Wiremock and Spock

Post on 08-Jan-2017

718 views 5 download

Transcript of Resilience testing with Wiremock and Spock

<david.schmitz@senacor.com>

Resilient Services with Wiremock Effective REST tests using Wiremock and Spock

https://flic.kr/p/orejhX

<david.schmitz@senacor.com>

How does your system handle failures?

<david.schmitz@senacor.com>

Everybody tests the happy path…

https://flic.kr/p/9MHEme

<david.schmitz@senacor.com>

Happy Path Tests

HTTP/1.1 200 OK

{“publicId":"42634558","data":"foo"}

GET http://service/resource/12

Client Service

<david.schmitz@senacor.com>

But what about the not-so-happy path?

https://flic.kr/p/CSnr1

<david.schmitz@senacor.com>

Enter Wiremock• Stub and Mock framework

for testing HTTP(s) traffic

• Features include

• Request verification,

• record, playback,

• fault injection,

• unit test and stand alone

Client Unit Test

EmbeddedWiremock

Client Standalone Wiremock

<david.schmitz@senacor.com>

How does it work?

Client Wiremock

Request Mapping

Response Data

$ curl -H ‘Accept: application/json’ http://localhost:8080/sample/

<david.schmitz@senacor.com>

How does it work?

Client Wiremock

Request Mapping

Response Data

• Starts embedded Jetty Server

• Acts as a proxy to the actual service

• Is used by the client transparently

<david.schmitz@senacor.com>

How does it work?

Client Wiremock

Request Mapping

Response Data

"request" : { "url" : "/sample/", "method" : "GET", } } }, "response" : { "status" : 200, "bodyFileName" : "body.json", "headers" : { "Content-Type" : “application/json" … } }

<david.schmitz@senacor.com>

How does it work?

Client Wiremock

Request Mapping

Response Data

body.json: [{"publicId":"...","data":"..."}, {"publicId":"...","data":"..."}]

<david.schmitz@senacor.com>

Creating a Wiremock Unittest

Prepare Stub

Configure Wiremock

Consume REST service

<david.schmitz@senacor.com>

Creating a Wiremock Unittest

Prepare Stub

Configure Wiremock

Consume REST service

<david.schmitz@senacor.com>

Creating a Wiremock Unittest

Prepare Stub

Configure Wiremock

Consume REST service

<david.schmitz@senacor.com>

Creating a Wiremock Unittest

Prepare Stub

Configure Wiremock

Consume REST service

<david.schmitz@senacor.com>

Creating a Wiremock Unittest

Prepare Stub

Configure Wiremock

Consume REST service

<david.schmitz@senacor.com>

…but what about failures?

HTTP/1.1 503 Service Unavailable

Client Service

GET http://service/resource/12

<david.schmitz@senacor.com>

Testing Failures

<david.schmitz@senacor.com>

…but what about bad responses?

Client Service

HTTP/1.1 200 OK Content-Type: application/json;charset=UTF-8

[300 MB of random garbage]

GET http://service/resource/12

<david.schmitz@senacor.com>

Testing Unexpected Behavior

<david.schmitz@senacor.com>

…but what about timeouts?

java.net.SocketTimeoutException: Read timed out

Client Service

GET http://service/resource/12

<david.schmitz@senacor.com>

Testing the circuit breaker

Record and Playback

https://flic.kr/p/nRXLqh

<david.schmitz@senacor.com>

Record and Playback

Run requests

Start Wiremock in record mode

Start Wiremock in playback mode

<david.schmitz@senacor.com>

Record and Playback

Demo

<david.schmitz@senacor.com>

Summary• Resilience can be tested

• Do not rely on happy paths and mocks only

• Use stubs and verify in unit tests

• Use record and playback for external services

• Make sure not to be the developer responsible for a downtime during the busy-business-time :D

<david.schmitz@senacor.com>

Links

http://wiremock.org/

https://github.com/koenighotze/wiremock-tryout/

<david.schmitz@senacor.com>

THANK YOU!<david.schmitz@senacor.com>

<david.schmitz@senacor.com>

BACKUP

<david.schmitz@senacor.com>

Testing a ClientClient Unit Test

EmbeddedWiremock