Reducing Build Time - Aman King

42
Saturday, 26 Saturday, 26 th th March, 2011 March, 2011

Transcript of Reducing Build Time - Aman King

Page 1: Reducing Build Time - Aman King

Saturday, 26Saturday, 26thth March, 2011 March, 2011

Page 2: Reducing Build Time - Aman King

Reducing build timewhen patience is not a virtue

Aman KingApplication Developer

ThoughtWorks

Page 3: Reducing Build Time - Aman King

Recognize these?

Page 4: Reducing Build Time - Aman King

Rank these

Page 5: Reducing Build Time - Aman King

Did you choose this?

1 32

Page 6: Reducing Build Time - Aman King

Or did you choose this?

1 23

Page 7: Reducing Build Time - Aman King

Patience is not always a virtue!

Page 8: Reducing Build Time - Aman King

Fail fast!quick feedback

Page 9: Reducing Build Time - Aman King

Rank these

High functional coverage

Short build time

Page 10: Reducing Build Time - Aman King

Did you choose this?

①High functional coverage

②Short build time

Page 11: Reducing Build Time - Aman King

Or did you choose this?

①Short build time

②High functional coverage

Page 12: Reducing Build Time - Aman King

You can choose both!

①Short build time

①High functional coverage

Page 13: Reducing Build Time - Aman King

But before we see how…

Page 14: Reducing Build Time - Aman King

Project background

Page 15: Reducing Build Time - Aman King

Content driven, community oriented

website

Page 16: Reducing Build Time - Aman King

Ruby on Rails

Cucumber+

Capybara+

Selenium

Page 17: Reducing Build Time - Aman King

4 : 1 ratio of Dev : QA

Everyone writes functional tests in a common automation

suite

Acceptance Test Driven Development (ATDD)

Page 18: Reducing Build Time - Aman King

Our problems

Page 19: Reducing Build Time - Aman King

Long build time~ 55 minutes

Page 20: Reducing Build Time - Aman King

Non-deterministic failures

Page 21: Reducing Build Time - Aman King

Manual reruns needed

Page 22: Reducing Build Time - Aman King

Our solution:Parallelization

Page 23: Reducing Build Time - Aman King

Basic idea

Page 24: Reducing Build Time - Aman King

Reduced build time~ 5 minutes

Page 25: Reducing Build Time - Aman King

Build time chart

Page 26: Reducing Build Time - Aman King

What we did

Page 27: Reducing Build Time - Aman King

Parallelization on a single multicore machine

used Ruby library parallel_tests

Page 28: Reducing Build Time - Aman King

Report generation in parallelwrote custom report formatter

Page 29: Reducing Build Time - Aman King

Isolating databaseseach process needs its own database

Page 30: Reducing Build Time - Aman King

database.ymltest: &test adapter: mysql2 encoding: utf8 reconnect: false database: myapp_test<%= ENV['TEST_ENV_NUMBER'] %> pool: 5 username: root password:

Page 31: Reducing Build Time - Aman King

Isolating external dependencies (Solr)

each process needs its own Solr instance

Page 32: Reducing Build Time - Aman King

sunspot.ymltest: solr: hostname: localhost port: <%= 8982 - ENV['TEST_ENV_NUMBER'].to_i %> log_level: INFO #WARNING log_file: <%= File.join(::Rails.root, 'log', "solr_#{ENV['TEST_ENV_NUMBER'].to_i}.log") %> data_path: <%= File.join(::Rails.root, 'solr', 'data’, "#{ENV['TEST_ENV_NUMBER'].to_i}") %> pid_path: <%= File.join(::Rails.root, 'solr', 'pids', "#{ENV['TEST_ENV_NUMBER'].to_i}") %>

Page 33: Reducing Build Time - Aman King

Handling multiple Firefox instances

and Selenium’s use of

shared ephemeral ports

Page 34: Reducing Build Time - Aman King

Monitoring Memory and CPU usage

adjust number of parallel process accordingly

Page 35: Reducing Build Time - Aman King

Auto rerunning failed testsnon-deterministic failures are likelier with

the CPU under stress

Page 36: Reducing Build Time - Aman King

Beyond parallelization…

Page 37: Reducing Build Time - Aman King

Stubbing external callsreduce dependency-related delays where

avoidable

Page 38: Reducing Build Time - Aman King

Consolidating scenarioscombine similar test scenarios into single

runs instead of separate tests

Page 39: Reducing Build Time - Aman King

Maintaining conventions when writing automated tests

avoid time-based wait statements, use test framework APIs that take lesser time, etc

Page 40: Reducing Build Time - Aman King

Conclusion

Page 41: Reducing Build Time - Aman King

Resourceshttp://cukes.info

http://rubygems.org/gems/capybara

http://seleniumhq.org/projects/remote-control

http://rubygems.org/gems/parallel_tests

http://selenium-grid.seleniumhq.org

http://test-load-balancer.github.com

http://github.com/bblimke/webmock

http://testing.thoughtworks.com

Page 42: Reducing Build Time - Aman King

Thank you

[email protected]://www.wikyblog.com/AmanKing