KEMBAR78
Resilience testing with Wiremock and Spock | PDF
<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
Embedded
Wiremock
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 Client
Client Unit Test
Embedded
Wiremock

Resilience testing with Wiremock and Spock