Rocket Fuelled Cucumbers Joseph Wilk Dealing with an Outbreak of - - PowerPoint PPT Presentation
Rocket Fuelled Cucumbers Joseph Wilk Dealing with an Outbreak of - - PowerPoint PPT Presentation
Rocket Fuelled Cucumbers Joseph Wilk Dealing with an Outbreak of Cucumbers Joseph Wilk No Cucumbers where harmed in the making of this presentation. Just mildly shaken up Scenario : Happy Railsconf attendees Given you have a vague idea what
Dealing with an Outbreak of Cucumbers
Joseph Wilk
No Cucumbers where harmed in the making of this presentation.
Just mildly shaken up
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
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
Your code makes it slow Cucumber provides the venue
Shame on you
What are Acceptance Tests?
- Customer-facing
- Cut through the whole stack
- Examples of how the system is intended
to be used
You made me Cuke
1 minute ~ build
1 minute ~ build Local builds
1 minute ~ build Autotest Local builds
1 minute ~ build Autotest Local builds Growl
Don’t Panic
Slow testing problems
Development is slowed down by the time to run focused Cukes Running all the Cukes takes too long!
Development Test Build Types of Feedback
Speed Confidence
- +
Speed Confidence +
Happiness is a 10 min build time
Slow builds are the enemy of continuous integration
Development Feedback
Its too slow to run the cukes. Just push the code and run away
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
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 ...
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
http://vimeo.com/12500864
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
Just enough Database
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
Test Build Feedback
Commit code Have a 1 hour nap
Options
- Hardware
- Intelligent test selection
- Tighter focused tests
- Divide and Conquer
Testjour
Songkick.com 254 Features, 1257 scenarios, 10807 steps 1 build server ~ 4 hours 5 build servers ~ 2 hours
120 sad minutes of my life...
$ git clone git://github.com/brynary/testjour.git $ rake gem install $ testjour --help
$ git clone git://github.com/brynary/testjour.git $ rake gem install $ testjour --help testjour help:
Testjour
Master Work Queue Slave
Redis
Slave Slave Worker Worker Worker Worker Worker Worker
Testjour
Master Work Queue Slave
Redis
Slave Slave
rsync - code rsync - code
Worker Worker Worker Worker Worker Worker
Testjour
Master Work Queue Slave
Redis
Slave Slave
rsync - code rsync - code
Worker Worker Worker Worker Worker Worker
Testjour
Master Work Queue Slave
Redis
Slave Slave
rsync - code rsync - code
Worker Worker Worker Worker Worker Worker
Looking to the Cloud
EC2, Rackspace Cloud, Windows Azure
Looking to the Cloud
EC2, Rackspace Cloud, Windows Azure 1 build server ~ 4 hours
Looking to the Cloud
EC2, Rackspace Cloud, Windows Azure 1 build server ~ 4 hours 20 build servers ~ 11:40 minutes
Looking to the Cloud
EC2, Rackspace Cloud, Windows Azure 1 build server ~ 4 hours 20 build servers ~ 11:40 minutes $2068.99 / $3000
Ec2
AMI slim-sumo
Disc image
Ec2
AMI
Launch
slim-sumo
Disc image
Ec2
AMI
Launch
ec2 node ec2 node ec2 node ec2 node slim-sumo
Disc image
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
http://vimeo.com/12467100
require 'rubygems' require 'hydra' require 'hydra/tasks' Hydra::TestTask.new('hydra') do |t| t.add_files 'features/**/*.feature' t.verbose = false t.autosort = false end
“Buy lots of hardware”
“Buy lots of hardware” “more hardware please”
“Buy lots of hardware” “more hardware please” “Just a little bit more hardware”
“Buy lots of hardware” “more hardware please” “Just a little bit more hardware”
Just run the tests that matter...
Failure probability matters
European Computing manufacturer
Failure probability matters
European Computing manufacturer Automated test suite ~ 18 hours
Failure probability matters
European Computing manufacturer Tests that were most ~ 2 hours likely to fail Automated test suite ~ 18 hours
http://vimeo.com/12467122
Tests that never fail
Tests that never fail
Tests that never fail Tests which regularly fail
Daily Build Tests that never fail Tests which regularly fail
Daily Build Nightly Build Tests that never fail Tests which regularly fail
Daily Build Nightly Build Tests that never fail Tests which regularly fail
$cucumber --tags ~@nightly $cucumber --tags @nightly
Flickering Confidence
Flickering Confidence
FAIL
Flickering Confidence
FAIL FAIL
Flickering Confidence
FAIL PASS FAIL
Flickering Confidence
FAIL PASS FAIL Main Flicker
@flicker
Divide and conquer
- Rails - Engines
- Service Orientated Architecture
1 hour 7 7 7 7 7 7 7 7 7
Divide and Concuquer
Divide and Concuquer
Divide and Concuquer
Divide and Concuquer
Divide and Concuquer
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”
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”
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”
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”
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”
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”
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
Don’t use Acceptance tests
http://jamesshore.com/Blog/Alternatives- to-Acceptance-Testing.html
Heresy!
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 | ....
| 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”
Pairwise
http://www.screencast.com/t/NGI0NjVk
We should add some funky Ajax features
Just when you thought things were going well
JavaScript
In-memory Browser based
Selenium, Watir Celerity
Need for speed
Webrat Celerity Watir Selenium 3.75 7.5 11.25 15
12.9 12 12 0.8
start-up time (seconds)
Capybara
Like Webrat but bigger
envjs
Johnson
spidermonkey
gem install johnson --prerelease gem install envjs sudo gem install capybara
http://vimeo.com/12467133
Capybara-envjs
Find the right compromise for you
Find the right compromise for you Slow test builds produce slow release cycles
Find the right compromise for you Slow test builds produce slow release cycles Your test builds are a goldmine of data
Thanks
Joseph Wilk http://blog.josephwilk.net @josephwilk
Its been emotional