Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rocket Fuelled Cucumbers

Joseph Wilk
September 22, 2011

Rocket Fuelled Cucumbers

Talk given at Railsconf 2010 in Baltimore, MD. Introduces lots of ideas about how to scale your tests.

Joseph Wilk

September 22, 2011
Tweet

More Decks by Joseph Wilk

Other Decks in Programming

Transcript

  1. Scenario: Happy Railsconf attendees Given you have a vague idea

    what Cucumber is When Joseph completes his presentation Then you should understand the scaling choices And you should feel better prepared to face them
  2. Cucumber • BDD framework • Plaintext • Promotes communication Given

    /^I have trained monkeys$/ do @test_pilots << Monkeys.new end Feature: Filling Cucumbers with rocket fuel Scenario: Rocket fuel Given I have trained monkeys When I click the launch button Then the monkeys should not die
  3. What are Acceptance Tests? • Customer-facing • Cut through the

    whole stack • Examples of how the system is intended to be used
  4. Slow testing problems Development is slowed down by the time

    to run focused Cukes Running all the Cukes takes too long!
  5. Reuse - Spork $ spork cucumber $ cucumber --drb require

    'rubygems' require 'spork' Spork.prefork do puts "I'm loading all the heavy stuff..." end Spork.each_run do puts "I'm loading the stuff just for this run..." # Cucumber hooks must go here end git://github.com/timcharper/spork.git
  6. Slow services • Search • Solr • Sphinx • Databases

    • Mongo • Redis • Mysql • Message Queues • RabbitMQ Before('@solr') do Solr.boot unless Solr.running? end Feature: Searching @solr Scenario: Indexed search Given ... When ... Then ...
  7. Run Just Enough Tests # * Test files must be

    stored in test/ # * Test files names must start with test_ # * Test class names must start with Test # * Implementation files must be stored in lib/ # * Implementation files must match up with a # test file named # test_.*implementation.rb @analyzer = Rcov::CodeCoverageAnalyzer.new Cucover Autotest
  8. Slicing Features Tagging Filenames $ cucumber --tags @media Subsystems $

    cucumber visitor_* $ cucumber features/admin/* Profiles $ cucumber --profile admin @media, @public Feature: Visitor views artist’s media @feed, @admin Feature: Logged in user views views their activity feed
  9. Just enough Database city data venue data SELECT * FROM

    `cities` WHERE (`cities`.`id` = 105838) INSERT INTO `cities` (`name`) VALUES ('Test name') INSERT INTO `venues` ... SELECT * FROM `venues` WHERE ... Cache Cache
  10. Testjour Master Work Queue Slave Redis Slave Slave rsync -

    code rsync - code Worker Worker Worker Worker Worker Worker
  11. Testjour Master Work Queue Slave Redis Slave Slave rsync -

    code rsync - code Worker Worker Worker Worker Worker Worker
  12. Testjour Master Work Queue Slave Redis Slave Slave rsync -

    code rsync - code Worker Worker Worker Worker Worker Worker
  13. Looking to the Cloud EC2, Rackspace Cloud, Windows Azure 1

    build server ~ 4 hours 20 build servers ~ 11:40 minutes
  14. Looking to the Cloud EC2, Rackspace Cloud, Windows Azure 1

    build server ~ 4 hours 20 build servers ~ 11:40 minutes $2068.99 / $3000
  15. Ec2 AMI Launch ec2 node ec2 node ec2 node ec2

    node slim-sumo Build ENV['EC2_URL'] = ec2_url require 'slim-sumo' Sumo.new.running.map{|ec2_node| ec2_node[:hostname]} Disc image
  16. Failure probability matters European Computing manufacturer Tests that were most

    ~ 2 hours likely to fail Automated test suite ~ 18 hours
  17. Daily Build Nightly Build Tests that never fail Tests which

    regularly fail $cucumber --tags ~@nightly $cucumber --tags @nightly
  18. Divide and Concuquer Scenario: Related artists Given an artist “SYGC”

    And “M.Bison” is related to “SYGC” When I visit the artist Then I should see within Similar Artists a link to “M.Bison”
  19. Divide and conquer Rails Scenario: Related artists Given an artist

    “SYGC” And “M.Bison” is related to “SYGC” When I visit the artist Then I should see within Similar Artists a link to “M.Bison”
  20. Divide and conquer Related Artists Service Rails Scenario: Related artists

    Given an artist “SYGC” And “M.Bison” is related to “SYGC” When I visit the artist Then I should see within Similar Artists a link to “M.Bison”
  21. Divide and conquer related(artist) Related Artists Service Rails Scenario: Related

    artists Given an artist “SYGC” And “M.Bison” is related to “SYGC” When I visit the artist Then I should see within Similar Artists a link to “M.Bison”
  22. Divide and conquer related(artist) Related Artists Service HTML Rails Scenario:

    Related artists Given an artist “SYGC” And “M.Bison” is related to “SYGC” When I visit the artist Then I should see within Similar Artists a link to “M.Bison”
  23. Divide and conquer related(artist) Related Artists Service HTML Rails Scenario:

    Related artists Given an artist “SYGC” And “M.Bison” is related to “SYGC” When I visit the artist Then I should see within Similar Artists a link to “M.Bison”
  24. Divide and conquer related(artist) Related Artists Service HTML Rails Scenario:

    Related artists Given an artist “SYGC” And “M.Bison” is related to “SYGC” When I visit the artist Then I should see within Similar Artists a link to “M.Bison” unit test unit test
  25. Pairwise Scenario: Testing Cucumber against different environments Given I have

    a rails app <Rails version> And I’m using Ruby <Ruby version> And I am using the <Test Framework> And I am using the driver <Driver> Then Cucumber should install and play nicely Examples: | Rails version | Ruby version | test framework | Driver | | 3.0 | 1.8.7 | Rspec | Webrat | | 3.0 | 1.8.7 | Testunit | Capybara | | 3.0 | 1.8.7 | Rspec | Capybara | | 3.0 | 1.8.7 | Testunit | Webrat | | 3.0 | 1.9 | Rspec | Webrat | | 3.0 | 1.9 | Testunit | Webrat | | 2.3.1 | 1.9 | Rspec | Webrat | ....
  26. | Rails version | Ruby version | test framework |

    Driver | | 2.3.1 | 1.8.7 | Rspec | Webrat | | 2.3.1 | 1.8.7 | Rspec | Capybara | | 2.3.1 | 1.8.7 | Testunit | Webrat | | 2.3.1 | 1.8.7 | Testunit | Capybara | | 2.3.1 | 1.9 | Rspec | Capybara | | 2.3.1 | 1.9 | Rspec | Webrat | | 2.3.1 | 1.9 | Testunit | Capybara | | 2.3.1 | 1.9 | Testunit | Webrat | .... “most faults are caused by interactions of at most two factors”
  27. Need for speed Webrat Celerity Watir Selenium 0 3.75 7.5

    11.25 15 12.9 12 12 0.8 start-up time (seconds)
  28. Capybara Like Webrat but bigger envjs Johnson spidermonkey gem install

    johnson --prerelease gem install envjs sudo gem install capybara
  29. Find the right compromise for you Slow test builds produce

    slow release cycles Your test builds are a goldmine of data