VHS

a ruby gem for

stubbing every API call in tests

git: joaquin-rivera/vhs

Status quo

git: joaquin-rivera/vhs

XTM

Users API

many API calls

Profiles API

Events API

Problem

git: joaquin-rivera/vhs

 

 

- slow tests

- unreliable results due to network glitches, sandbox is down

- takes time to set up sandboxes + services

- hard to stub API calls in high level (feature) specs

Test suite also does many API calls

Enter VHS

git: joaquin-rivera/vhs

XTM

Users API

Profiles API

Events API

first-time call => records request

repeated calls => replays request

VCR

VCR

VCR

wraps around VCR at typhoeus level

VHS Advantages

git: joaquin-rivera/vhs

Test suite does less API calls

 

- faster tests

- reliable, deterministic results => NO intermittent red builds

- no need to change your specs

- no need to set up sandboxes + services

Usage

git: joaquin-rivera/vhs

gem 'vhs'

bundle

vhs-config-rspec.rb

rake spec # records the VCR cassettes

rake spec # replays existing VCR cassettes

cassettes are YAML files saved under 

spec/fixtures/vcr as default

No stub collision

git: joaquin-rivera/vhs

Turn VHS off to stub yourself

# some spec file

describe YourClass, vhs: false do

context 'also can use rspec tag', vhs: false do

it 'needs VHS to be turned off', vhs: false do

it 'is an spec stubbing RESTApi call' do
  # ... code goes here
  VHS.turn_off
  # stub as needed
  RESTApi.stub(:get, %r{/rest/users/users/ ... })
  VHS.turn_on
  # ... from here on VHS takes over again
end

Dynamic cassettes

git: joaquin-rivera/vhs

Before adding cassettes to git

---
- !ruby/struct:VCR::HTTPInteraction
  request: !ruby/struct:VCR::Request
    method: :post
    uri: http://qi-joaquin-rivera.env.xing.com:3007/rest/search-proxy/templates/xtm/search?rid=internal&consumer=loggedin.web.xtm.search.center
$ vcr-dinamyze-cassettes.rb

dynamize your cassettes

---
- !ruby/struct:VCR::HTTPInteraction
  request: !ruby/struct:VCR::Request
    method: :post
    uri: <%= api_host %>/search-proxy/templates/xtm/search?rid=internal&consumer=loggedin.web.xtm.search.center

now they use AppConfig.sandbox.rest_url

Learn by using

git: joaquin-rivera/vhs

- RESTApi.run_with_time_bandit breaks

- RESTApi::Request.check_response_token breaks

- Request with HTTP Status Code = 0, 4xx, 5xx

- Correct frequency to update cassettes

- Improve patterns when writing specs

- a.s.o...

check code, README and wiki for details 

Benchmark 

git: joaquin-rivera/vhs

without VHS

Finished in 12 minutes 1 second (files took 7.37 seconds to load)
1879 examples, 1 failure, 2 pending

VHS recording
Finished in 11 minutes 11 seconds (files took 8.02 seconds to load)
1884 examples, 79 failures, 2 pending

VHS replaying
Finished in 8 minutes 53 seconds (files took 7.97 seconds to load)
1884 examples, 69 failures, 2 pending

3 minutes gain as of today

but of course we are not green yet ;-)

Contact me

joaquin-rivera/vcr

Joaquin Rivera @ xing

 

- You need help to use VHS

- Ideas

- Opinions

- Questions

- Pull Requests

joaquin-rivera/vhs

git: 

VHS a ruby gem for stubbing every API call in tests

By Joaquin Rivera Padron

VHS a ruby gem for stubbing every API call in tests

VHS is a ruby gem that records every API calls in your tests, then it replays them every time you run your tests.

  • 1,969