rocket fuelled cucumbers

99
Rocket Fuelled Cucumbers Joseph Wilk

Upload: joseph-wilk

Post on 12-May-2015

7.171 views

Category:

Technology


0 download

DESCRIPTION

Talk given at Railsconf 2010 in Baltimore, MD. Covers ways of scaling tests.

TRANSCRIPT

Page 1: Rocket Fuelled Cucumbers

Rocket FuelledCucumbers

Joseph Wilk

Page 2: Rocket Fuelled Cucumbers

Dealing with an Outbreak of Cucumbers

Joseph Wilk

Page 3: Rocket Fuelled Cucumbers

No Cucumbers where harmed in the making of

this presentation.

Just mildly shaken up

Page 4: Rocket Fuelled Cucumbers

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

Page 5: Rocket Fuelled Cucumbers

Cucumber

• BDD framework

• Plaintext

• Promotes communication

Given /^I have trained monkeys$/ do @test_pilots << Monkeys.newend

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

Page 6: Rocket Fuelled Cucumbers

Your code makes it slow

Cucumber provides the venue

Shame on you

Page 7: Rocket Fuelled Cucumbers

What are Acceptance Tests?

• Customer-facing

• Cut through the whole stack

• Examples of how the system is intended to be used

Page 8: Rocket Fuelled Cucumbers
Page 9: Rocket Fuelled Cucumbers

You mademe Cuke

Page 10: Rocket Fuelled Cucumbers
Page 11: Rocket Fuelled Cucumbers

1 minute ~ build

Page 12: Rocket Fuelled Cucumbers

1 minute ~ build

Local builds

Page 13: Rocket Fuelled Cucumbers

1 minute ~ build

AutotestLocal builds

Page 14: Rocket Fuelled Cucumbers

1 minute ~ build

AutotestLocal builds

Growl

Page 15: Rocket Fuelled Cucumbers
Page 16: Rocket Fuelled Cucumbers
Page 17: Rocket Fuelled Cucumbers

Don’tPanic

Page 18: Rocket Fuelled Cucumbers

Slow testing problems

Development is slowed down by the time to run

focused Cukes

Running all the Cukes takes too long!

Page 19: Rocket Fuelled Cucumbers

Development

Test Build

Types of Feedback

SpeedConfidence

-+

SpeedConfidence

+-

Page 20: Rocket Fuelled Cucumbers

Happiness is a 10 min build time

Page 21: Rocket Fuelled Cucumbers

Slow builds arethe enemy of continuous integration

Page 22: Rocket Fuelled Cucumbers

Development Feedback

Its too slow to run the cukes.Just push the code and run away

Page 23: Rocket Fuelled Cucumbers

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 hereend

git://github.com/timcharper/spork.git

Page 24: Rocket Fuelled Cucumbers

Slow services

• Search

• Solr

• Sphinx

• Databases

• Mongo

• Redis

• Mysql

• Message Queues

• RabbitMQ

Before('@solr') do Solr.boot unless Solr.running?end

Feature: Searching

@solrScenario: Indexed search Given ... When ... Then ...

Page 25: Rocket Fuelled Cucumbers

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

Page 26: Rocket Fuelled Cucumbers

http://vimeo.com/12500864

Page 27: Rocket Fuelled Cucumbers

Slicing Features

Tagging

Filenames

$ cucumber --tags @media

Subsystems

$ cucumber visitor_*

$ cucumber features/admin/*

Profiles $ cucumber --profile admin

@media, @publicFeature: Visitor views artist’s media

@feed, @adminFeature: Logged in user views views their activity feed

Page 28: Rocket Fuelled Cucumbers

Just enough Database

Page 29: Rocket Fuelled Cucumbers

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

Page 30: Rocket Fuelled Cucumbers

Test Build Feedback

Commit codeHave a 1 hour nap

Page 31: Rocket Fuelled Cucumbers

Options

• Hardware

• Intelligent test selection

• Tighter focused tests

• Divide and Conquer

Page 32: Rocket Fuelled Cucumbers

TestjourSongkick.com

254 Features, 1257 scenarios, 10807 steps

1 build server ~ 4 hours

5 build servers ~ 2 hours

Page 33: Rocket Fuelled Cucumbers

120 sad minutes of my life...

Page 34: Rocket Fuelled Cucumbers

$ git clone git://github.com/brynary/testjour.git$ rake gem install

$ testjour --help

Page 35: Rocket Fuelled Cucumbers

$ git clone git://github.com/brynary/testjour.git$ rake gem install

$ testjour --help

testjour help:

Page 36: Rocket Fuelled Cucumbers

Testjour

MasterWorkQueue

Slave

Redis

Slave

Slave

Worker

Worker

Worker

Worker

Worker

Worker

Page 37: Rocket Fuelled Cucumbers

Testjour

MasterWorkQueue

Slave

Redis

Slave

Slaversync - code

rsync - codeWorker

Worker

Worker

Worker

Worker

Worker

Page 38: Rocket Fuelled Cucumbers

Testjour

MasterWorkQueue

Slave

Redis

Slave

Slaversync - code

rsync - codeWorker

Worker

Worker

Worker

Worker

Worker

Page 39: Rocket Fuelled Cucumbers

Testjour

MasterWorkQueue

Slave

Redis

Slave

Slaversync - code

rsync - codeWorker

Worker

Worker

Worker

Worker

Worker

Page 40: Rocket Fuelled Cucumbers

Looking to the Cloud

EC2, Rackspace Cloud, Windows Azure

Page 41: Rocket Fuelled Cucumbers

Looking to the Cloud

EC2, Rackspace Cloud, Windows Azure

1 build server ~ 4 hours

Page 42: Rocket Fuelled Cucumbers

Looking to the Cloud

EC2, Rackspace Cloud, Windows Azure

1 build server ~ 4 hours

20 build servers ~ 11:40 minutes

Page 43: Rocket Fuelled Cucumbers

Looking to the Cloud

EC2, Rackspace Cloud, Windows Azure

1 build server ~ 4 hours

20 build servers ~ 11:40 minutes

$2068.99 / $3000

Page 44: Rocket Fuelled Cucumbers

Ec2

AMI

slim-sumo

Disc image

Page 45: Rocket Fuelled Cucumbers

Ec2

AMILaunch

slim-sumo

Disc image

Page 46: Rocket Fuelled Cucumbers

Ec2

AMILaunch

ec2 node

ec2 node

ec2 node

ec2 node

slim-sumo

Disc image

Page 47: Rocket Fuelled Cucumbers

Ec2

AMILaunch

ec2 node

ec2 node

ec2 node

ec2 node

slim-sumo

BuildENV['EC2_URL'] = ec2_urlrequire 'slim-sumo'Sumo.new.running.map{|ec2_node| ec2_node[:hostname]}

Disc image

Page 48: Rocket Fuelled Cucumbers

http://vimeo.com/12467100

Page 49: Rocket Fuelled Cucumbers

require 'rubygems'require 'hydra'require 'hydra/tasks'

Hydra::TestTask.new('hydra') do |t| t.add_files 'features/**/*.feature' t.verbose = false t.autosort = falseend

Page 50: Rocket Fuelled Cucumbers
Page 51: Rocket Fuelled Cucumbers

“Buy lots of hardware”

Page 52: Rocket Fuelled Cucumbers

“Buy lots of hardware”

“more hardware please”

Page 53: Rocket Fuelled Cucumbers

“Buy lots of hardware”

“more hardware please”

“Just a little bit more hardware”

Page 54: Rocket Fuelled Cucumbers

“Buy lots of hardware”

“more hardware please”

“Just a little bit more hardware”

Page 55: Rocket Fuelled Cucumbers

Just run the tests that matter...

Page 56: Rocket Fuelled Cucumbers

Failure probability matters

European Computing manufacturer

Page 57: Rocket Fuelled Cucumbers

Failure probability matters

European Computing manufacturer

Automated test suite ~ 18 hours

Page 58: Rocket Fuelled Cucumbers

Failure probability matters

European Computing manufacturer

Tests that were most ~ 2 hours likely to fail

Automated test suite ~ 18 hours

Page 59: Rocket Fuelled Cucumbers

http://vimeo.com/12467122

Page 60: Rocket Fuelled Cucumbers
Page 61: Rocket Fuelled Cucumbers

Tests that never fail

Page 62: Rocket Fuelled Cucumbers

Tests that never fail

Page 63: Rocket Fuelled Cucumbers

Tests that never fail

Tests which regularly fail

Page 64: Rocket Fuelled Cucumbers

Daily Build

Tests that never fail

Tests which regularly fail

Page 65: Rocket Fuelled Cucumbers

Daily Build Nightly Build

Tests that never fail

Tests which regularly fail

Page 66: Rocket Fuelled Cucumbers

Daily Build Nightly Build

Tests that never fail

Tests which regularly fail

$cucumber --tags ~@nightly $cucumber --tags @nightly

Page 67: Rocket Fuelled Cucumbers

Flickering Confidence

Page 68: Rocket Fuelled Cucumbers

Flickering Confidence

FAIL

Page 69: Rocket Fuelled Cucumbers

Flickering Confidence

FAIL

FAIL

Page 70: Rocket Fuelled Cucumbers

Flickering Confidence

FAIL

PASS

FAIL

Page 71: Rocket Fuelled Cucumbers

Flickering Confidence

FAIL

PASS

FAIL

Main Flicker@flicker

Page 72: Rocket Fuelled Cucumbers

Divide and conquer

• Rails - Engines

• Service Orientated Architecture

1 hour

7 7 7

7 7 7

7 7 7

Page 73: Rocket Fuelled Cucumbers

Divide and Concuquer

Page 74: Rocket Fuelled Cucumbers

Divide and Concuquer

Page 75: Rocket Fuelled Cucumbers

Divide and Concuquer

Page 76: Rocket Fuelled Cucumbers

Divide and Concuquer

Page 77: Rocket Fuelled Cucumbers

Divide and Concuquer

Page 78: Rocket Fuelled Cucumbers

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”

Page 79: Rocket Fuelled Cucumbers

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”

Page 80: Rocket Fuelled Cucumbers

Divide and conquer

RelatedArtistsService

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”

Page 81: Rocket Fuelled Cucumbers

Divide and conquer

related(artist)

RelatedArtistsService

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”

Page 82: Rocket Fuelled Cucumbers

Divide and conquer

related(artist)

RelatedArtistsService

HTMLRails

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”

Page 83: Rocket Fuelled Cucumbers

Divide and conquer

related(artist)

RelatedArtistsService

HTMLRails

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”

Page 84: Rocket Fuelled Cucumbers

Divide and conquer

related(artist)

RelatedArtistsService

HTMLRails

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 testunit test

Page 86: Rocket Fuelled Cucumbers

PairwiseScenario: 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 | ....

Page 87: Rocket Fuelled Cucumbers

| 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”

Page 88: Rocket Fuelled Cucumbers

Pairwise

http://www.screencast.com/t/NGI0NjVk

Page 89: Rocket Fuelled Cucumbers

We should add some funky Ajax features

Just when you thought things were going well

Page 90: Rocket Fuelled Cucumbers

JavaScript

In-memoryBrowser basedSelenium, Watir Celerity

Page 91: Rocket Fuelled Cucumbers

Need for speedWebrat

Celerity

Watir

Selenium

0 3.75 7.5 11.25 15

12.9

12

12

0.8

start-up time (seconds)

Page 92: Rocket Fuelled Cucumbers

CapybaraLike Webrat but bigger

envjsJohnson

spidermonkey

gem install johnson --prerelease

gem install envjs

sudo gem install capybara

Page 93: Rocket Fuelled Cucumbers

http://vimeo.com/12467133

Page 94: Rocket Fuelled Cucumbers

Capybara-envjs

Page 95: Rocket Fuelled Cucumbers
Page 96: Rocket Fuelled Cucumbers

Find the right compromise for you

Page 97: Rocket Fuelled Cucumbers

Find the right compromise for you

Slow test builds produce slow release cycles

Page 98: Rocket Fuelled Cucumbers

Find the right compromise for you

Slow test builds produce slow release cycles

Your test builds are a goldmine of data

Page 99: Rocket Fuelled Cucumbers

Thanks

Joseph Wilkhttp://blog.josephwilk.net

@josephwilk

Its been emotional