92
@markbates Tuesday, September 10, 13

A Big Look at MiniTest

  • Upload
    mark

  • View
    2.222

  • Download
    4

Embed Size (px)

DESCRIPTION

Presented at BostonRB on September 10th, 2013

Citation preview

Page 1: A Big Look at MiniTest

@markbates

Tuesday, September 10, 13

Page 2: A Big Look at MiniTest

A

Tuesday, September 10, 13

Page 3: A Big Look at MiniTest

BIGTuesday, September 10, 13

Page 4: A Big Look at MiniTest

look at

Tuesday, September 10, 13

Page 5: A Big Look at MiniTest

MiniTest

Tuesday, September 10, 13

Page 6: A Big Look at MiniTest

Tuesday, September 10, 13

Page 7: A Big Look at MiniTest

Tuesday, September 10, 13

Page 8: 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

Tuesday, September 10, 13

Page 9: A Big Look at MiniTest

Step 1: Setup Testing Framework

Tuesday, September 10, 13

Page 10: A Big Look at MiniTest

Tuesday, September 10, 13

Page 11: A Big Look at MiniTest

Tuesday, September 10, 13

Page 12: A Big Look at MiniTest

Tuesday, September 10, 13

Page 13: A Big Look at MiniTest

Tuesday, September 10, 13

Page 14: A Big Look at MiniTest

• RSpec

• MiniTest

• test-unit

• Bacon

• Riot

• Wrong

• Shindo

• testrocket

• rubydoctest

• Testy

• Micronaut

• Kintama

• dtf

• assert

• test_inline

• Lemon

• Detest

Tuesday, September 10, 13

Page 15: A Big Look at MiniTest

MiniTest

Tuesday, September 10, 13

Page 16: A Big Look at MiniTest

Good Things Come in Small Packages

Tuesday, September 10, 13

Page 17: A Big Look at MiniTest

Tuesday, September 10, 13

Page 18: A Big Look at MiniTest

Tuesday, September 10, 13

Page 19: A Big Look at MiniTest

Tuesday, September 10, 13

Page 20: A Big Look at MiniTest

Tuesday, September 10, 13

Page 21: 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

Tuesday, September 10, 13

Page 22: 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

Tuesday, September 10, 13

Page 23: A Big Look at MiniTest

Tuesday, September 10, 13

Page 24: A Big Look at MiniTest

IT SHIPS WITH RUBY!!!

Tuesday, September 10, 13

Page 25: A Big Look at MiniTest

>= 1.9

Tuesday, September 10, 13

Page 26: A Big Look at MiniTest

also available as a gem

Tuesday, September 10, 13

Page 27: A Big Look at MiniTest

Familiar Syntax to RSpec or Test::Unit

Tuesday, September 10, 13

Page 28: A Big Look at MiniTest

MiniTest replaced Test::Unit in 1.9

Tuesday, September 10, 13

Page 29: A Big Look at MiniTest

The Basics

Tuesday, September 10, 13

Page 30: A Big Look at MiniTest

MiniTest::Spec

Tuesday, September 10, 13

Page 31: A Big Look at MiniTest

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

Tuesday, September 10, 13

Page 32: 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

Tuesday, September 10, 13

Page 33: A Big Look at MiniTest

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

Tuesday, September 10, 13

Page 34: 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

Tuesday, September 10, 13

Page 35: 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

Tuesday, September 10, 13

Page 36: 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

Tuesday, September 10, 13

Page 37: 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>'

Tuesday, September 10, 13

Page 38: A Big Look at MiniTest

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

Tuesday, September 10, 13

Page 39: A Big Look at MiniTest

Pending

Tuesday, September 10, 13

Page 40: 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

Tuesday, September 10, 13

Page 41: 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  

Tuesday, September 10, 13

Page 42: A Big Look at MiniTest

Expectations

Tuesday, September 10, 13

Page 43: 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

Tuesday, September 10, 13

Page 44: 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

Tuesday, September 10, 13

Page 45: 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

Tuesday, September 10, 13

Page 46: A Big Look at MiniTest

MiniTest::Unit

Tuesday, September 10, 13

Page 47: A Big Look at MiniTest

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

Tuesday, September 10, 13

Page 48: 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

Tuesday, September 10, 13

Page 49: 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

Tuesday, September 10, 13

Page 50: A Big Look at MiniTest

No let

Tuesday, September 10, 13

Page 51: A Big Look at MiniTest

No subject

Tuesday, September 10, 13

Page 52: A Big Look at MiniTest

Pending

Tuesday, September 10, 13

Page 53: 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

Tuesday, September 10, 13

Page 54: 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

Tuesday, September 10, 13

Page 55: A Big Look at MiniTest

Assertions

Tuesday, September 10, 13

Page 56: 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

Tuesday, September 10, 13

Page 57: 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

Tuesday, September 10, 13

Page 58: A Big Look at MiniTest

Mocking/Stubbing

Tuesday, September 10, 13

Page 59: A Big Look at MiniTest

Very Basic

Tuesday, September 10, 13

Page 60: 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

Tuesday, September 10, 13

Page 61: 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

Tuesday, September 10, 13

Page 62: 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  

Tuesday, September 10, 13

Page 63: 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

Tuesday, September 10, 13

Page 64: A Big Look at MiniTest

Struct, OpenStruct

Tuesday, September 10, 13

Page 65: 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

Tuesday, September 10, 13

Page 66: 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

Tuesday, September 10, 13

Page 67: A Big Look at MiniTest

Mocha, RR, FlexMock

Tuesday, September 10, 13

Page 68: A Big Look at MiniTest

CustomAssertions

Tuesday, September 10, 13

Page 69: 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

Tuesday, September 10, 13

Page 70: 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

Tuesday, September 10, 13

Page 71: 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

Tuesday, September 10, 13

Page 72: A Big Look at MiniTest

Rails

Tuesday, September 10, 13

Page 73: A Big Look at MiniTest

gem “minitest-rails”

Tuesday, September 10, 13

Page 74: 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

Tuesday, September 10, 13

Page 75: 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

Tuesday, September 10, 13

Page 76: A Big Look at MiniTest

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

Tuesday, September 10, 13

Page 77: A Big Look at MiniTest

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

Tuesday, September 10, 13

Page 78: 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

Tuesday, September 10, 13

Page 79: A Big Look at MiniTest

gem “guard-minitest”

Tuesday, September 10, 13

Page 80: 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

Tuesday, September 10, 13

Page 81: A Big Look at MiniTest

gem “m”

Tuesday, September 10, 13

Page 82: A Big Look at MiniTest

m  test/models/user_test.rb:37

Tuesday, September 10, 13

Page 83: A Big Look at MiniTest

gem “minitest-rails-capybara”

Tuesday, September 10, 13

Page 84: 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

Tuesday, September 10, 13

Page 85: A Big Look at MiniTest

Wrapping Up

Tuesday, September 10, 13

Page 86: A Big Look at MiniTest

familiar syntax

Tuesday, September 10, 13

Page 87: A Big Look at MiniTest

95% of RSpec

Tuesday, September 10, 13

Page 88: A Big Look at MiniTest

lightweight

Tuesday, September 10, 13

Page 89: 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)

Tuesday, September 10, 13

Page 90: A Big Look at MiniTest

Ships with Ruby!

Tuesday, September 10, 13

Page 91: 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

Tuesday, September 10, 13

Page 92: A Big Look at MiniTest

Thanks!@markbates

www.metacasts.tv

Tuesday, September 10, 13