a big look at minitest

129
@markbates Friday, October 4, 13

Upload: mark

Post on 12-May-2015

849 views

Category:

Technology


5 download

DESCRIPTION

Presented at ArrrrCamp.be on October 4th, 2013

TRANSCRIPT

Page 1: A Big Look at MiniTest

@markbates

Friday, October 4, 13

Page 2: A Big Look at MiniTest

good morningbonjour

goedemorgen

Friday, October 4, 13

Page 3: A Big Look at MiniTest

after last night...

Friday, October 4, 13

Page 4: A Big Look at MiniTest

a change of topic...

Friday, October 4, 13

Page 5: A Big Look at MiniTest

watch mark sleep...

Friday, October 4, 13

Page 6: A Big Look at MiniTest

isn’t this nice?

Friday, October 4, 13

Page 7: A Big Look at MiniTest

do not disturb

Friday, October 4, 13

Page 8: A Big Look at MiniTest

shh...

Friday, October 4, 13

Page 9: A Big Look at MiniTest

fine, i’ll get up!

Friday, October 4, 13

Page 10: A Big Look at MiniTest

@markbates

Friday, October 4, 13

Page 11: A Big Look at MiniTest

hire me*(consulting only)

Friday, October 4, 13

Page 12: A Big Look at MiniTest

Friday, October 4, 13

Page 13: A Big Look at MiniTest

Friday, October 4, 13

Page 14: A Big Look at MiniTest

Friday, October 4, 13

Page 15: A Big Look at MiniTest

PIRATE13www.metacasts.tv

Friday, October 4, 13

Page 16: A Big Look at MiniTest

Friday, October 4, 13

Page 17: A Big Look at MiniTest

A

Friday, October 4, 13

Page 18: A Big Look at MiniTest

BIGFriday, October 4, 13

Page 19: A Big Look at MiniTest

look at

Friday, October 4, 13

Page 20: A Big Look at MiniTest

MiniTest

Friday, October 4, 13

Page 21: A Big Look at MiniTest

Friday, October 4, 13

Page 22: A Big Look at MiniTest

Friday, October 4, 13

Page 23: A Big Look at MiniTest

#  Running  tests:  ...........................................  Finished  tests  in  1.851323s,  1.6014  tests/s,  6.7781  assertions/s.  43  tests,  182  assertions,  0  failures,  0  errors,  0  skips

Friday, October 4, 13

Page 24: A Big Look at MiniTest

Step 1: Setup Testing Framework

Friday, October 4, 13

Page 25: A Big Look at MiniTest

Friday, October 4, 13

Page 26: A Big Look at MiniTest

Friday, October 4, 13

Page 27: A Big Look at MiniTest

Friday, October 4, 13

Page 28: A Big Look at MiniTest

Friday, October 4, 13

Page 29: A Big Look at MiniTest

• RSpec

• MiniTest

• test-unit

• Bacon

• Riot

• Wrong

• Shindo

• testrocket

• rubydoctest

• Testy

• Micronaut

• Kintama

• dtf

• assert

• test_inline

• Lemon

• Detest

Friday, October 4, 13

Page 30: A Big Look at MiniTest

MiniTest

Friday, October 4, 13

Page 31: A Big Look at MiniTest

Good Things Come in Small Packages

Friday, October 4, 13

Page 32: A Big Look at MiniTest

Friday, October 4, 13

Page 33: A Big Look at MiniTest

Friday, October 4, 13

Page 34: A Big Look at MiniTest

Friday, October 4, 13

Page 35: A Big Look at MiniTest

Friday, October 4, 13

Page 36: A Big Look at MiniTest

require  'minitest/autorun'  class  Foo    def  add(x,  y)        x  +  y    endend  describe  Foo  do    describe  '#add'  do        it  'adds  two  numbers'  do            Foo.new.add(4,  2).must_equal  6        end    endend

Friday, October 4, 13

Page 37: A Big Look at MiniTest

require  'minitest/autorun'  class  Foo    def  add(x,  y)        x  +  y    endend  class  TestFoo  <  MiniTest::Unit::TestCase    def  test_add        assert_equal  6,  Foo.new.add(4,  2)    endend

Friday, October 4, 13

Page 38: A Big Look at MiniTest

Friday, October 4, 13

Page 39: A Big Look at MiniTest

IT SHIPS WITH RUBY!!!

Friday, October 4, 13

Page 40: A Big Look at MiniTest

>= 1.9

Friday, October 4, 13

Page 41: A Big Look at MiniTest

also available as a gem

Friday, October 4, 13

Page 42: A Big Look at MiniTest

Familiar Syntax to RSpec or Test::Unit

Friday, October 4, 13

Page 43: A Big Look at MiniTest

MiniTest replaced Test::Unit in 1.9

Friday, October 4, 13

Page 44: A Big Look at MiniTest

The Basics

Friday, October 4, 13

Page 45: A Big Look at MiniTest

MiniTest::Spec

Friday, October 4, 13

Page 46: A Big Look at MiniTest

describe  Something  do              

 end

Friday, October 4, 13

Page 47: A Big Look at MiniTest

describe  Something  do      it  "does  something"  do          #  tests  go  here    end  end

Friday, October 4, 13

Page 48: A Big Look at MiniTest

describe  Something  do      before  do          #  setup  code  goes  here    end      after  do          #  tear  down  code  goes  here    end      it  "does  something"  do          #  tests  go  here    end  end

Friday, October 4, 13

Page 49: A Big Look at MiniTest

describe  Something  do      describe  'something  else'  do          it  "does  something"  do              #  tests  go  here        end      end  end

Friday, October 4, 13

Page 50: A Big Look at MiniTest

describe  Something  do      let(:something)  {  Something.new(name:  'Widget')  }      describe  'something  else'  do          it  "does  something"  do            something.name.must_equal  'Widget'        end      end  end

Friday, October 4, 13

Page 51: A Big Look at MiniTest

describe  Something  do      subject  {  Something.new(name:  'Widget')  }      describe  'something  else'  do          it  "does  something"  do            subject.name.must_equal  'Widget'        end      end  end

Friday, October 4, 13

Page 52: A Big Look at MiniTest

describe  Something  do      subject  {  Something.new(name:  'Widget')  }      context  'something  else'  do          it  "does  something"  do            subject.name.must_equal  'Widget'        end      end  end

Friday, October 4, 13

Page 53: A Big Look at MiniTest

scrap.rb:19:in  `block  in  <main>':  undefined  method  `context'  for  #<Class:0x007fce92074b40>  (NoMethodError)                from  /Users/markbates/.../lib/minitest/spec.rb:71:in  `class_eval'                from  /Users/markbates/.../lib/minitest/spec.rb:71:in  `describe'                from  scrap.rb:15:in  `<main>'

Friday, October 4, 13

Page 54: A Big Look at MiniTest

class  MiniTest::Spec          

 end

Friday, October 4, 13

Page 55: A Big Look at MiniTest

class  MiniTest::Spec      class  <<  self        alias  :context  :describe    end  end

Friday, October 4, 13

Page 56: A Big Look at MiniTest

Pending

Friday, October 4, 13

Page 57: A Big Look at MiniTest

describe  Something  do                        end

Friday, October 4, 13

Page 58: A Big Look at MiniTest

describe  Something  do      it  'does  something'                  end

Friday, October 4, 13

Page 59: A Big Look at MiniTest

describe  Something  do      it  'does  something'      it  'does  something  else'  do        skip    end          end

Friday, October 4, 13

Page 60: A Big Look at MiniTest

describe  Something  do      it  'does  something'      it  'does  something  else'  do        skip    end      it  'does  another  thing'  do        skip  "here's  some  reason  why"    end  end

Friday, October 4, 13

Page 61: A Big Look at MiniTest

#  Running  tests:  SSS  Finished  tests  in  0.000912s,  3289.4737  tests/s,  0.0000  assertions/s.  3  tests,  0  assertions,  0  failures,  0  errors,  3  skips  

Friday, October 4, 13

Page 62: A Big Look at MiniTest

Expectations

Friday, October 4, 13

Page 63: A Big Look at MiniTest

• must_be

• must_be_close_to

• must_be_empty

• must_be_instance_of

• must_be_kind_of

• must_be_nil

• must_be_same_as

• must_be_silent

• must_be_within_epsilon

• must_equal

• must_include

• must_match

• must_output

• must_respond_to

• must_raise

• must_send

• must_throw

Friday, October 4, 13

Page 64: A Big Look at MiniTest

• wont_be

• wont_be_close_to

• wont_be_empty

• wont_be_instance_of

• wont_be_kind_of

• wont_be_nil

• wont_be_same_as

• wont_be_silent

• wont_be_within_epsilon

• wont_equal

• wont_include

• wont_match

• wont_output

• wont_respond_to

• wont_raise

• wont_send

• wont_throw

Friday, October 4, 13

Page 65: A Big Look at MiniTest

describe  Something  do      it  "does  something"  do        lambda  {nil  /  2}.must_raise  NoMethodError        ["one",  "two"].must_include  "one"        ["one",  "two"].wont_include  "three"        nil.must_be_nil        [].must_be  :empty?    end  end

Friday, October 4, 13

Page 66: A Big Look at MiniTest

MiniTest::Unit

Friday, October 4, 13

Page 67: A Big Look at MiniTest

class  TestSomething  <  MiniTest::Unit::TestCase          end

Friday, October 4, 13

Page 68: A Big Look at MiniTest

class  TestSomething  <  MiniTest::Unit::TestCase      def  test_something        #tests  go  here    end  end

Friday, October 4, 13

Page 69: A Big Look at MiniTest

class  TestSomething  <  MiniTest::Unit::TestCase      def  setup        #  setup  code  goes  here    end      def  teardown        #  tear  down  code  goes  here    end      def  test_something        #  tests  go  here    end  end

Friday, October 4, 13

Page 70: A Big Look at MiniTest

class  TestSomething  <  MiniTest::Unit::TestCase      def  test_something        assert  true    end                          end

Friday, October 4, 13

Page 71: A Big Look at MiniTest

class  TestSomething  <  MiniTest::Unit::TestCase      def  test_something        assert  true    end      class  TestSomethingElse  <  MiniTest::Unit::TestCase            def  test_something_else            assert  true        end            end  end

Friday, October 4, 13

Page 72: A Big Look at MiniTest

No let

Friday, October 4, 13

Page 73: A Big Look at MiniTest

No subject

Friday, October 4, 13

Page 74: A Big Look at MiniTest

Pending

Friday, October 4, 13

Page 75: A Big Look at MiniTest

class  SomethingTest  <  MiniTest::Unit::TestCase                  end

Friday, October 4, 13

Page 76: A Big Look at MiniTest

class  SomethingTest  <  MiniTest::Unit::TestCase      def  test_something        skip    end          end

Friday, October 4, 13

Page 77: A Big Look at MiniTest

class  SomethingTest  <  MiniTest::Unit::TestCase      def  test_something        skip    end      def  test_something_else        skip  "here's  some  reason  why"    end  end

Friday, October 4, 13

Page 78: A Big Look at MiniTest

#  Running  tests:  SS  Finished  tests  in  0.000663s,  3016.5913  tests/s,  0.0000  assertions/s.  2  tests,  0  assertions,  0  failures,  0  errors,  2  skips

Friday, October 4, 13

Page 79: A Big Look at MiniTest

Assertions

Friday, October 4, 13

Page 80: A Big Look at MiniTest

• assert

• assert_block

• assert_empty

• assert_equal

• assert_in_delta

• assert_in_epsilon

• assert_includes

• assert_instance_of

• assert_kind_of

• assert_match

• assert_nil

• assert_operator

• assert_output

• assert_raises

• assert_respond_to

• assert_same

• assert_send

• assert_silent

Friday, October 4, 13

Page 81: A Big Look at MiniTest

• refute

• refute_block

• refute_empty

• refute_equal

• refute_in_delta

• refute_in_epsilon

• refute_includes

• refute_instance_of

• refute_kind_of

• refute_match

• refute_nil

• refute_operator

• refute_output

• refute_raises

• refute_respond_to

• refute_same

• refute_send

• refute_silent

Friday, October 4, 13

Page 82: A Big Look at MiniTest

Mocking/Stubbing

Friday, October 4, 13

Page 83: A Big Look at MiniTest

Very Basic

Friday, October 4, 13

Page 84: A Big Look at MiniTest

describe  Something  do      let(:something)  {  MiniTest::Mock.new  }      it  "does  something"  do                          end  end

Friday, October 4, 13

Page 85: A Big Look at MiniTest

describe  Something  do      let(:something)  {  MiniTest::Mock.new  }      it  "does  something"  do        something.expect(:name,  'Widget')                  end  end

Friday, October 4, 13

Page 86: A Big Look at MiniTest

describe  Something  do      let(:something)  {  MiniTest::Mock.new  }      it  "does  something"  do        something.expect(:name,  'Widget')        something.name.must_equal  'Widget'          end  end

Friday, October 4, 13

Page 87: A Big Look at MiniTest

describe  Something  do      let(:something)  {  MiniTest::Mock.new  }      it  "does  something"  do        something.expect(:name,  'Widget')        something.name.must_equal  'Widget'        something.verify    end  end

Friday, October 4, 13

Page 88: A Big Look at MiniTest

describe  Something  do      let(:something)  {  MiniTest::Mock.new  }      it  "does  something"  do        something.expect(:name,  'Widget')        something.verify    end  end

Friday, October 4, 13

Page 89: A Big Look at MiniTest

#  Running  tests:  E  Finished  tests  in  0.000858s,  1165.5012  tests/s,  0.0000  assertions/s.      1)  Error:OpenStruct#test_0001_does  something:MockExpectationError:  expected  name()  =>  "Widget",  got  []        scrap.rb:22:in  `block  (2  levels)  in  <main>'  1  tests,  0  assertions,  0  failures,  1  errors,  0  skips  

Friday, October 4, 13

Page 90: A Big Look at MiniTest

describe  Something  do      let(:something)  {  Something.new(name:  'Widget')  }      it  "does  something"  do                      end  end

Friday, October 4, 13

Page 91: A Big Look at MiniTest

describe  Something  do      let(:something)  {  Something.new(name:  'Widget')  }      it  "does  something"  do        something.stub(:name,  'Thingy')  do                    end    end  end

Friday, October 4, 13

Page 92: A Big Look at MiniTest

describe  Something  do      let(:something)  {  Something.new(name:  'Widget')  }      it  "does  something"  do        something.stub(:name,  'Thingy')  do            something.name.must_equal  'Thingy'        end    end  end

Friday, October 4, 13

Page 93: A Big Look at MiniTest

Struct, OpenStruct

Friday, October 4, 13

Page 94: A Big Look at MiniTest

describe  "Something"  do      let(:something)  {  OpenStruct.new(name:  'Widget')  }      it  "does  something"  do        something.name.must_equal  'Widget'    end  end

Friday, October 4, 13

Page 95: A Big Look at MiniTest

describe  Something  do      let(:something)  {  Something.new(name:  'Widget')  }      it  "does  something"  do                          something.name.must_equal  'Thingy'    end  end

Friday, October 4, 13

Page 96: A Big Look at MiniTest

describe  Something  do      let(:something)  {  Something.new(name:  'Widget')  }      it  "does  something"  do        def  something.name            "Thingy"        end        something.name.must_equal  'Thingy'    end  end

Friday, October 4, 13

Page 97: A Big Look at MiniTest

Mocha, RR, FlexMock

Friday, October 4, 13

Page 98: A Big Look at MiniTest

CustomAssertions

Friday, October 4, 13

Page 99: A Big Look at MiniTest

describe  Something  do      it  "does  something"  do        1.2.must_round_to  1        1.7.wont_round_to  1    end  end

Friday, October 4, 13

Page 100: A Big Look at MiniTest

module  MiniTest::Assertions                      end  

Friday, October 4, 13

Page 101: A Big Look at MiniTest

module  MiniTest::Assertions      def  assert_equals_rounded(rounded,  decimal)      end              end  

Friday, October 4, 13

Page 102: A Big Look at MiniTest

module  MiniTest::Assertions      def  assert_equals_rounded(rounded,  decimal)        assert  rounded  ==  decimal.round,  "Expected  #{decimal}  to  round  to  #{rounded}"    end              end  

Friday, October 4, 13

Page 103: A Big Look at MiniTest

module  MiniTest::Assertions      def  assert_equals_rounded(rounded,  decimal)        assert  rounded  ==  decimal.round,  "Expected  #{decimal}  to  round  to  #{rounded}"    end      def  refute_equals_rounded(rounded,  decimal)            end  end  

Friday, October 4, 13

Page 104: A Big Look at MiniTest

module  MiniTest::Assertions      def  assert_equals_rounded(rounded,  decimal)        assert  rounded  ==  decimal.round,  "Expected  #{decimal}  to  round  to  #{rounded}"    end      def  refute_equals_rounded(rounded,  decimal)        assert  rounded  !=  decimal.round,  "Expected  #{decimal}  to  not  round  to  #{rounded}"    end  end  

Friday, October 4, 13

Page 105: A Big Look at MiniTest

module  MiniTest::Assertions      def  assert_equals_rounded(rounded,  decimal)        assert  rounded  ==  decimal.round,  "Expected  #{decimal}  to  round  to  #{rounded}"    end      def  refute_equals_rounded(rounded,  decimal)        assert  rounded  !=  decimal.round,  "Expected  #{decimal}  to  not  round  to  #{rounded}"    end  end  Numeric.infect_an_assertion  :assert_equals_rounded,  :must_round_toNumeric.infect_an_assertion  :refute_equals_rounded,  :wont_round_to

Friday, October 4, 13

Page 106: A Big Look at MiniTest

describe  Something  do      it  "does  something"  do        1.2.must_round_to  1        1.7.wont_round_to  1    end  end

Friday, October 4, 13

Page 107: A Big Look at MiniTest

Rails

Friday, October 4, 13

Page 108: A Big Look at MiniTest

gem “minitest-rails”

Friday, October 4, 13

Page 109: A Big Look at MiniTest

ENV["RAILS_ENV"]  =  "test"require  File.expand_path("../../config/environment",  __FILE__)require  "rails/test_help"require  "minitest/rails"  #  Add  `gem  "minitest-­‐rails-­‐capybara"`  to  the  test  group  of  your  Gemfile#  and  uncomment  the  following  if  you  want  Capybara  feature  tests#  require  "minitest/rails/capybara"  

 

 

 

 

Friday, October 4, 13

Page 110: A Big Look at MiniTest

ENV["RAILS_ENV"]  =  "test"require  File.expand_path("../../config/environment",  __FILE__)require  "rails/test_help"require  "minitest/rails"  #  Add  `gem  "minitest-­‐rails-­‐capybara"`  to  the  test  group  of  your  Gemfile#  and  uncomment  the  following  if  you  want  Capybara  feature  tests#  require  "minitest/rails/capybara"  

 class  ActiveSupport::TestCase      #  Add  more  helper  methods  to  be  used  by  all  tests  here...    before  do    end      after  do    end  end

Friday, October 4, 13

Page 111: A Big Look at MiniTest

ENV["RAILS_ENV"]  =  "test"require  File.expand_path("../../config/environment",  __FILE__)require  "rails/test_help"require  "minitest/rails"  #  Add  `gem  "minitest-­‐rails-­‐capybara"`  to  the  test  group  of  your  Gemfile#  and  uncomment  the  following  if  you  want  Capybara  feature  tests#  require  "minitest/rails/capybara"  module  MiniTest::Expectations    infect_an_assertion  :assert_redirected_to,  :must_redirect_to    infect_an_assertion  :assert_template,  :must_render_template    infect_an_assertion  :assert_response,  :must_respond_withend  class  ActiveSupport::TestCase      #  Add  more  helper  methods  to  be  used  by  all  tests  here...    before  do    end      after  do    end  end

Friday, October 4, 13

Page 112: A Big Look at MiniTest

rake  minitest                              #  Run  default  testsrake  minitest:all                      #  Run  all  testsrake  minitest:all:quick          #  Run  all  tests,  ungrouped  for  quicker  executionrake  minitest:controllers      #  Runs  tests  under  test/controllersrake  minitest:lib                      #  Runs  tests  under  test/librake  minitest:models                #  Runs  tests  under  test/models

Friday, October 4, 13

Page 113: A Big Look at MiniTest

task  :mt  =>  'minitest:all:quick'Rake::Task["default"].cleartask  :default  =>  :mt

Friday, October 4, 13

Page 114: A Big Look at MiniTest

ruby  -­‐I  test  test/models/user_test.rb

Friday, October 4, 13

Page 115: A Big Look at MiniTest

describe  FeedController  do      describe  '#index'  do          it  'renders  an  atom  feed'  do            get  :index              must_render_template  :index        end          it  'redirects  from  an  RSS  feed'  do            get  :index,  format:  'rss'              must_redirect_to  feed_path(format:  :atom)        end      end  end

Friday, October 4, 13

Page 116: A Big Look at MiniTest

gem “guard-minitest”

Friday, October 4, 13

Page 117: A Big Look at MiniTest

guard  :minitest  do    watch(%r|^app/controllers/(.*)\.rb|)  {  |m|  "test/controllers/#{m[1]}_test.rb"  }    watch(%r|^app/helpers/(.*)\.rb|)          {  |m|  "test/helpers/#{m[1]}_test.rb"  }    watch(%r|^app/models/(.*)\.rb|)            {  |m|  "test/models/#{m[1]}_test.rb"  }    watch(%r{^test/test_helper\.rb})          {  'test'  }    watch(%r{^test/.+_test\.rb})    watch(%r{^app/(.+)\.rb})                                                              {  |m|  "test/#{m[1]}_test.rb"  }    watch(%r{^app/controllers/application_controller\.rb})  {  'test/controllers'  }    watch(%r{^lib/(.+)\.rb})                                                              {  |m|  "test/lib/#{m[1]}_test.rb"  }end

Friday, October 4, 13

Page 118: A Big Look at MiniTest

gem “m”

Friday, October 4, 13

Page 119: A Big Look at MiniTest

m  test/models/user_test.rb:37

Friday, October 4, 13

Page 120: A Big Look at MiniTest

gem “minitest-rails-capybara”

Friday, October 4, 13

Page 121: A Big Look at MiniTest

feature  "Can  Access  Home"  do      scenario  "has  content"  do        visit  root_path        assert  page.has_content?("Home#index")    end    end

Friday, October 4, 13

Page 122: A Big Look at MiniTest

Wrapping Up

Friday, October 4, 13

Page 123: A Big Look at MiniTest

familiar syntax

Friday, October 4, 13

Page 124: A Big Look at MiniTest

95% of RSpec

Friday, October 4, 13

Page 125: A Big Look at MiniTest

lightweight

Friday, October 4, 13

Page 126: A Big Look at MiniTest

rspec  (2.14.1)    rspec-­‐core  (~>  2.14.0)    rspec-­‐expectations  (~>  2.14.0)    rspec-­‐mocks  (~>  2.14.0)rspec-­‐core  (2.14.5)rspec-­‐expectations  (2.14.2)    diff-­‐lcs  (>=  1.1.3,  <  2.0)

Friday, October 4, 13

Page 127: A Big Look at MiniTest

Ships with Ruby!

Friday, October 4, 13

Page 128: A Big Look at MiniTest

• https://github.com/seattlerb/minitest

• http://www.mattsears.com/articles/2011/12/10/minitest-quick-reference

• http://blog.arvidandersson.se/2012/03/28/minimalicous-testing-in-ruby-1-9

• https://github.com/blowmage/minitest-rails-capybara

• https://github.com/guard/guard-minitest

• https://github.com/qrush/m

• http://www.metacasts.tv/casts/minitest-spec

• http://www.metacasts.tv/casts/minitest-rails

• http://www.metacasts.tv/casts/testing-sinatra

Friday, October 4, 13

Page 129: A Big Look at MiniTest

Thanks!@markbates

www.metacasts.tv

Friday, October 4, 13