10/21/2015 1 10/21/2015 Challenges Integration tests fails due - - PDF document

10 21 2015 1
SMART_READER_LITE
LIVE PREVIEW

10/21/2015 1 10/21/2015 Challenges Integration tests fails due - - PDF document

10/21/2015 1 10/21/2015 Challenges Integration tests fails due to unreliable dependency servers Hard to test different test data permutations for dependency servers Need to do resiliency testing 2 10/21/2015 Our Solution


slide-1
SLIDE 1

10/21/2015 1

slide-2
SLIDE 2

10/21/2015 2

Challenges

  • Integration tests fails due to unreliable dependency servers
  • Hard to test different test data permutations for dependency servers
  • Need to do resiliency testing
slide-3
SLIDE 3

10/21/2015 3

Our Solution Overview of Wiremock

Wiremock is a library for stubbing and proxying web services

  • Stubbing
  • Fault Injection
  • Easy Set up
  • Easy onboarding
slide-4
SLIDE 4

10/21/2015 4

How does Wiremock work?

System Under Test Wiremock Server Dependency Server Automation Test

  • Configure the Wiremock server to be man-in-the-middle
  • Increased integration test pass rate
  • Increased code coverage
  • Does not interrupt other team’s calling the SUT

= Stubs

Overview of AWS

slide-5
SLIDE 5

10/21/2015 5

Overview of AWS

Amazon Web Services (AWS) is a cloud computing services

  • On-demand delivery of IT resources and applications
  • Pay-as-you-go pricing

AWS Architecture

Subnet ELB for SUT SUT 1 SUT 2 Subnet

slide-6
SLIDE 6

10/21/2015 6

Before Wiremock

Subnet ELB for SUT SUT 1 SUT 2 Dependency Server Subnet Automation Test

Wiremock in AWS

slide-7
SLIDE 7

10/21/2015 7

We tried this

Subnet ELB for SUT SUT 1 SUT 2 Subnet Automation Test

  • Deploy Wiremock on SUT EC2 instance
  • No consistent stub response!

= Stubs

Our Solution

ELB for WM SUT 1 SUT 2 Automation Test Wiremock

(Stub Dependency)

ELB for SUT

  • Deploy Wiremock on dedicated EC2 and ELB
  • Consistent Stub responses!

= Stubs

slide-8
SLIDE 8

10/21/2015 8

If no stubs…

ELB for WM SUT 1 SUT 2 Automation Test Wiremock ELB for SUT Dependency Server

WM will proxy the request to dependency server

Wiremock Code Snipets

slide-9
SLIDE 9

10/21/2015 9

Starting Up Wiremock Server

java -jar wiremock-1.53-standalone.jar --verbose -- port 8080 --proxy-all=[Dependency Server DNS Name]

Stubbing the response

//This calls Wiremock API to stub the response stubFor(get(urlEqualTo(“/from/where”)) .willReturn(aResponse().withStatus(200) .withHeader("Cache-Control", "no-cache") .withHeader("Content-Type", ”text/plain") .withBody(“Taiwan” )));

slide-10
SLIDE 10

10/21/2015 10

Simulating Fault

//This calls Wiremock API for fault injection stubFor(get(urlEqualTo(“/some/thing”)) .willReturn(aResponse() .withFault(Fault.EMPTY_RESPONSE)));

Automate WM Deployment

slide-11
SLIDE 11

10/21/2015 11

Automate Wiremock Deployment

Chef is an infrastructure automation code tool we use

  • Code how you deploy and manage your infrastructure
  • Allows version control
  • Code can be reused

Automate Wiremock Deployment

We wrote a Wiremock Recipe

  • Download the Wiremock jar
  • Start up the Wiremock server
slide-12
SLIDE 12

10/21/2015 12

Automate Wiremock Deployment

Berkshelf is a dependency manager for chef

  • Get the Java recipe to download Java
  • Get the Wiremock recipe to deploy Wiremock server

Chef Snipet

#This will start the Wiremock server with the parameters passed in function start { cd "${USER_DIRECTORY}" ;java -jar wiremock-${WIREMOCK_VERSION}-standalone.jar --port ${PORT} --proxy-via ${PROXY_VIA} -–proxy-all= ${PROXY_ALL} --verbose > /var/log/wiremock.log 2>&1 & }

slide-13
SLIDE 13

10/21/2015 13

Automate Wiremock Stack Creation

Use AWS CloudFormation API

  • Provision EC2 instances and ELB
  • Create Auto Scaling Group
  • Set up other AWS resources

Use WireMock

Call Chef from CloudFormation

slide-14
SLIDE 14

10/21/2015 14

How to Call Cookbook From CloudFormation

Write shell scripts In the InstanceLaunchConfig section

  • 1. Download and install chef
  • 2. Run Chef. In this case, we created a Wiremock role to

execute the Java and Wiremock cookbooks.

Call Chef from CloudFormation

"5_run_chef": { "command": { "Fn::Join": [ "", [ "/usr/bin/chef-solo -c /var/chef/config/solo.rb -o 'role[", { "Ref": "Role" }, "]' -E '", { "Ref": "Environment" },"'" ] ] }

slide-15
SLIDE 15

10/21/2015 15

Deep Dives

Demo

SUT Wiremock Server Yelp Test Automation

slide-16
SLIDE 16

10/21/2015 16

Recap

Recap

Solution: Wiremock

  • Tests don’t fail due to unreliable dependency servers
  • Less engineers’ time spent on unnecessary debugging
  • Resiliency issues are found before production
  • Less production escapes and firefighting
  • Happy Engineers
slide-17
SLIDE 17

10/21/2015 17

What we learned

What We Learned

  • The initial investment is worth it
  • Try to be flexible
  • Set up DNS
slide-18
SLIDE 18

10/21/2015 18

References

  • My talk for CI/CD with Mocking and Resiliency Testing in

AWS re:invent Conference

  • http://wiremock.org/
  • https://www.chef.io/
  • http://docs.aws.amazon.com/AWSCloudFormation/latest

/APIReference/Welcome.html

Contact

Lucy Chang Senior Software Engineer in Quality , Intuit https://www.linkedin.com/pub/lucy-chang/11/312/a83 Twitter: @bingbongbong888

slide-19
SLIDE 19

10/21/2015 19

Acknowledgement

Paper Reviewers Moss Drake Dave Patterson

Thank you!