making tdd [somewhat] bearable on openstack

58
Hart Hoover Making Test-Driven Development [Somewhat] Bearable on OpenStack @hhoover #rackstackatl

Upload: hart-hoover

Post on 08-May-2015

558 views

Category:

Technology


0 download

DESCRIPTION

OpenStack Summit May 2014

TRANSCRIPT

Page 1: Making TDD [Somewhat] Bearable on OpenStack

Hart Hoover

Making Test-Driven Development [Somewhat] Bearable on OpenStack

@hhoover#rackstackatl

Page 2: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

RACKSPACE VISION

To be recognized as one of the world’s great service companies.

Page 3: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

WELL TESTED = GOOD SERVICE

Page 4: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

TEST-DRIVEN DEVELOPMENT (TRADITIONAL)

Test-driven development is a software development process that relies on the repetition of a very short development cycle.

First the developer writes an (initially failing) automated test case that defines a desired improvement or new function,

then produces the minimum amount of code to pass that test,

then finally refactors the new code to acceptable standards.

Page 5: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

PLAN CODE BUILD TEST RELEASE DEPLOY OPS

THIS IS NOT TDDTHIS IS NOT “DEVOPS”

Page 6: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

PLAN CODE BUILD TEST RELEASE DEPLOY OPS

TESTTHAT’S A BIT BETTER(STILL NOT “DEVOPS”)

Page 7: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

TESTING IS A GOOD IDEA

FIND MISTAKES BEFORE

THEY HAPPEN

Page 8: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

TESTING IS A GOOD IDEA

YOUR TEAM WON’T HATE

YOU

Page 9: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

TESTING IS A GOOD IDEA

YOUR CUSTOMERS WON’T HATE

YOU

Page 10: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

THE PROBLEM…

Page 11: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

Object Placeholder

HERO CULTURE

Page 12: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

LAZINESS OR ARROGANCE

“I just want to write code, not tests.”

“My code works when I push it.”

“It works on my machine.”

“QA does the tests.”

Page 13: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

LEADERSHIP PRESSURE

Page 14: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

TIME IS MONEY

DEV TIME IS A LOT OF MONEY

&

Page 15: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

ONE SOLUTION: BE THE CHANGE YOU WANT TO SEE IN THE WORLD

Page 16: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

ANOTHER SOLUTION: CONTINUOUS TESTING

Page 17: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

TOOLS OF THE TRADE…

Page 18: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

http://hart.io

Page 19: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

Page 20: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

Page 21: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

Page 22: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

DEPLOY A CHEF SERVER WITH HEAT

https://github.com/rackspace-orchestration-templates/chef-server

Page 23: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT

http://www.getchef.com/downloads/chef-dk/

Page 24: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

chefCHEF DEVELOPMENT KIT: CLI TOOLS

knifechef-­‐client

Chef Zero

Ohai

Page 25: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT

Page 26: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT - BERKSHELF

source  ‘https://api.berkshelf.com'  metadata  !cookbook  ‘apt’,  ‘~>  2.0’  cookbook  ‘minitest-­‐handler’  cookbook  ‘yum’,  ‘~>  2.0’  cookbook  ‘build-­‐essential’,  github:  ‘opscode-­‐cookbooks/build-­‐essential’  cookbook  ‘mysql_test’,  :path  =>  ‘test/cookbooks/mysql_test’

Page 27: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT - BERKSHELF

source  ‘https://api.berkshelf.com'  metadata  !cookbook  ‘apt’,  ‘~>  2.0’  cookbook  ‘minitest-­‐handler’  cookbook  ‘yum’,  ‘~>  2.0’  cookbook  ‘build-­‐essential’,  github:  ‘opscode-­‐cookbooks/build-­‐essential’  cookbook  ‘mysql_test’,  :path  =>  ‘test/cookbooks/mysql_test’

Page 28: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT - BERKSHELF

source  ‘https://api.berkshelf.com'  metadata  !cookbook  ‘apt’,  ‘~>  2.0’  cookbook  ‘minitest-­‐handler’  cookbook  ‘yum’,  ‘~>  2.0’  cookbook  ‘build-­‐essential’,  github:  ‘opscode-­‐cookbooks/build-­‐essential’  cookbook  ‘mysql_test’,  :path  =>  ‘test/cookbooks/mysql_test’

Page 29: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT - BERKSHELF

source  ‘https://api.berkshelf.com'  metadata  !cookbook  ‘apt’,  ‘~>  2.0’  cookbook  ‘minitest-­‐handler’  cookbook  ‘yum’,  ‘~>  2.0’  cookbook  ‘build-­‐essential’,  github:  ‘opscode-­‐cookbooks/build-­‐essential’  cookbook  ‘mysql_test’,  :path  =>  ‘test/cookbooks/mysql_test’

Page 30: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT - BERKSHELF

source  ‘https://api.berkshelf.com'  metadata  !cookbook  ‘apt’,  ‘~>  2.0’  cookbook  ‘minitest-­‐handler’  cookbook  ‘yum’,  ‘~>  2.0’  cookbook  ‘build-­‐essential’,  github:  ‘opscode-­‐cookbooks/build-­‐essential’  cookbook  ‘mysql_test’,  :path  =>  ‘test/cookbooks/mysql_test’

Page 31: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

kitchen.ci/docs/guide

CHEF DEVELOPMENT KIT

Test Kitchen

Page 32: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

-­‐-­‐-­‐  provisioner:      name:  chef_solo  !platforms:      -­‐  name:  ubuntu-­‐14.04  !driver:      name:  rackspace      rackspace_region:  IAD      server_name:  rackspace-­‐ubuntu1404      image_id:  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca      flavor_id:  performance1-­‐1      require_chef_omnibus:  latest  !suites:      -­‐  name:  default          run_list:  recipe[cookbook::default]          attributes:

Page 33: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

-­‐-­‐-­‐  provisioner:      name:  chef_solo  !platforms:      -­‐  name:  ubuntu-­‐14.04  !driver:      name:  rackspace      rackspace_region:  IAD      server_name:  rackspace-­‐ubuntu1404      image_id:  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca      flavor_id:  performance1-­‐1      require_chef_omnibus:  latest  !suites:      -­‐  name:  default          run_list:  recipe[cookbook::default]          attributes:

Page 34: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

-­‐-­‐-­‐  provisioner:      name:  chef_solo  !platforms:      -­‐  name:  ubuntu-­‐14.04  !driver:      name:  rackspace      rackspace_region:  IAD      server_name:  rackspace-­‐ubuntu1404      image_id:  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca      flavor_id:  performance1-­‐1      require_chef_omnibus:  latest  !suites:      -­‐  name:  default          run_list:  recipe[cookbook::default]          attributes:

Page 35: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

-­‐-­‐-­‐  provisioner:      name:  chef_solo  !platforms:      -­‐  name:  ubuntu-­‐14.04  !driver:      name:  rackspace      rackspace_region:  IAD      server_name:  rackspace-­‐ubuntu1404      image_id:  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca      flavor_id:  performance1-­‐1      require_chef_omnibus:  latest  !suites:      -­‐  name:  default          run_list:  recipe[cookbook::default]          attributes:

Page 36: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

-­‐-­‐-­‐  provisioner:      name:  chef_solo  !platforms:      -­‐  name:  ubuntu-­‐14.04  !driver:      name:  rackspace      rackspace_region:  IAD      server_name:  rackspace-­‐ubuntu1404      image_id:  bb02b1a3-­‐bc77-­‐4d17-­‐ab5b-­‐421d89850fca      flavor_id:  performance1-­‐1      require_chef_omnibus:  latest  !suites:      -­‐  name:  default          run_list:  recipe[cookbook::default]          attributes:

Page 37: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT

Page 38: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT

ChefSpec• Built on RSpec• Converges a Chef run in memory• Overrides all providers to take no action• Mock Ohai data with Fauxhai

Page 39: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT: CHEFSPEC

https://github.com/sethvargo/chefspec/tree/master/examples

Page 40: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT: CHEFSPECrequire  'chefspec'  !describe  'apt_package::install'  do      let(:chef_run)  {  ChefSpec::Runner.new.converge(described_recipe)  }  !    it  'installs  a  apt_package  with  the  default  action'  do          expect(chef_run).to  install_apt_package('default_action')          expect(chef_run).to_not  install_apt_package('not_default_action')      end  end

Page 41: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT: CHEFSPECrequire  'chefspec'  !describe  'apt_package::install'  do      let(:chef_run)  {  ChefSpec::Runner.new.converge(described_recipe)  }  !    it  'installs  a  apt_package  with  the  default  action'  do          expect(chef_run).to  install_apt_package('default_action')          expect(chef_run).to_not  install_apt_package('not_default_action')      end  end

Page 42: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

CHEF DEVELOPMENT KIT: CHEFSPECrequire  'chefspec'  !describe  'apt_package::install'  do      let(:chef_run)  {  ChefSpec::Runner.new.converge(described_recipe)  }  !    it  'installs  a  apt_package  with  the  default  action'  do          expect(chef_run).to  install_apt_package('default_action')          expect(chef_run).to_not  install_apt_package('not_default_action')      end  end

Page 43: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

HONORABLE MENTIONS

Page 44: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

SERVERSPEC

• Built on RSpec• Uses SSH to test your servers’ state

Page 45: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

SERVERSPECdescribe  package('httpd')  do      it  {  should  be_installed  }  end  !describe  service('httpd')  do      it  {  should  be_enabled      }      it  {  should  be_running      }  end  !describe  port(80)  do      it  {  should  be_listening  }  end

Page 46: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

meez

https://github.com/paulczar/meez

Page 47: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

RUBOCOP: STYLE

RUBY STYLE GUIDE

• code layout• strings• syntax

• regex• more

Page 48: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

GUARD: TEST WHILE YOU WORK

Page 49: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

Page 50: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

source  'https://rubygems.org'  !gem  'berkshelf'  gem  'chef'  gem  'meez'  gem  'guard'  gem  'guard-­‐kitchen'  gem  'rubocop'  gem  'foodcritic'  gem  'chefspec'  gem  'test-­‐kitchen'  gem  'kitchen-­‐rackspace'  gem  'kitchen-­‐openstack'

Page 51: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

GET TO THE OPENSTACK STUFF

Page 52: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

source  'https://rubygems.org'  !gem  'berkshelf'  gem  'chef'  gem  'meez'  gem  'guard'  gem  'guard-­‐kitchen'  gem  'rubocop'  gem  'foodcritic'  gem  'chefspec'  gem  'test-­‐kitchen'  gem  'kitchen-­‐rackspace'  gem  'kitchen-­‐openstack'

Page 53: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

DEMO TIME!

Page 54: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl54

Page 55: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl55

Page 56: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

162.242.253.111LET’S PLAY ON THE CLOUD

Page 57: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

WE’RE HIRING

http://rackertalent.com

Page 58: Making TDD [Somewhat] Bearable on OpenStack

#rackstackatl

RACKSPACE® HOSTING | 5000 WALZEM ROAD | SAN ANTONIO, TX 78218 US SALES: 1-800-961-2888 | US SUPPORT: 1-800-961-4454 | WWW.RACKSPACE.COM

RACKSPACE® HOSTING | © RACKSPACE US, INC. | RACKSPACE® AND FANATICAL SUPPORT® ARE SERVICE MARKS OF RACKSPACE US, INC. REGISTERED IN THE UNITED STATES AND OTHER COUNTRIES. | WWW.RACKSPACE.COMRACKSPACE® HOSTING | © RACKSPACE US, INC. | RACKSPACE® AND FANATICAL SUPPORT® ARE SERVICE MARKS OF RACKSPACE US, INC. REGISTERED IN THE UNITED STATES AND OTHER COUNTRIES. | WWW.RACKSPACE.COM

Hart Hoover @hhoover