115
Cascadia Ruby Conf 2011 @ Seattle, Cascadia Ryan Davis, Seattle.rb Size Doesn’t Matter Size Doesn’t Matter Monday, August 1, 11

Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

SizeDoesn’tMatter

Monday, August 1, 11

Page 2: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

or:!e ins and outs

of Minitest

Monday, August 1, 11

Page 3: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

or:!e ins and outs

of MinitestDesi

Approved!

Monday, August 1, 11

Page 4: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Almost 11 years of

Ruby

84 slides in 30 minutes…

Keep up!

Monday, August 1, 11

Page 5: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

What is Minitest?• Replacement for ruby 1.8’s test/unit.

• Originally 90 lines of code.• Available as a gem, and in ruby 1.9.• Meant to be small, clean, and very fast.• Provides a lot more than test/unit did.

Monday, August 1, 11

Page 6: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

6 Parts of Minitestrunner The heart of the machineminitest/unit TDD APIminitest/spec BDD API minitest/mock Simple mocking APIminitest/pride IO pipelining exampleminitest/bench Abstract benchmark API

Monday, August 1, 11

Page 7: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Minitest Runner

Monday, August 1, 11

Page 8: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Every method starting with "test" is run in a new context.

Monday, August 1, 11

Page 9: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

No Magic Allowed• Even test discovery avoids

ObjectSpace.• Minimal metaprogramming.• Uses plain classes and methods to do

all work.

Monday, August 1, 11

Page 10: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Test randomization prevents order dependencies.

Monday, August 1, 11

Page 11: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Verbose mode prints test times in a sortable format:

% ruby -Ilib test/test_meta.rb -v | sort -k2 -t= -nr | head -3MetaMagic#test_generate_meta_method = 0.03 s = . MetaMagic#test_complex_method = 0.02 s = .MetaMagic#test_simple_method = 0.01 s = .

Monday, August 1, 11

Page 12: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Test summary provides useful statistics:

# Running tests:

........................................................................

........................................................................

........................................................................

........................................................................

........................................................................

........................................................................

........................................................................

........................................................................

........................................................................

....................................

Finished tests in 0.510616s, 1339.5585 tests/s, 7428.2827 assertions/s.

684 tests, 3793 assertions, 0 failures, 0 errors, 0 skips

Monday, August 1, 11

Page 13: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/unit

Monday, August 1, 11

Page 14: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Test Examplerequire "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_do_the_thing assert_equal 42, Thingy.do_the_thing endend

Monday, August 1, 11

Page 15: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Test Examplerequire "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_do_the_thing assert_equal 42, Thingy.do_the_thing endend

Simple Subclass

Monday, August 1, 11

Page 16: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Test Examplerequire "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_do_the_thing assert_equal 42, Thingy.do_the_thing endend

Simple Subclass

Simple Method

Monday, August 1, 11

Page 17: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Test Examplerequire "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_do_the_thing assert_equal 42, Thingy.do_the_thing endend

Magic Free!

Simple Subclass

Simple Method

Monday, August 1, 11

Page 18: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

assertions

Monday, August 1, 11

Page 19: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Positive Assertionsassertassert_blockassert_emptyassert_equalassert_in_deltaassert_in_epsilonassert_includesassert_instance_ofassert_kind_ofassert_match

assert_nilassert_operatorassert_outputassert_raisesassert_respond_toassert_sameassert_sendassert_silentassert_throws

Monday, August 1, 11

Page 20: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

assert_equal diffs: 1) Failure:test_failing_simple(TestSimple) [example.rb:8]:Expected: 42 Actual: 24

2) Failure:test_failing_complex(TestComplex) [example.rb:23]:--- expected+++ actual@@ -22,7 +22,7 @@ "line 22", "line 23", "line 24",- "line 25",+ "something unexpected", "line 26", "line 27", "line 28",

Monday, August 1, 11

Page 21: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Negative Assertionsrefuterefute_emptyrefute_equalrefute_in_deltarefute_in_epsilonrefute_includesrefute_instance_of

refute_kind_ofrefute_matchrefute_nilrefute_operatorrefute_respond_torefute_same

Monday, August 1, 11

Page 22: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Utility Methodspassskipcapture_io

flunkmu_ppmu_pp_for_diff

Monday, August 1, 11

Page 23: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

assert ! obj refute obj

assert collection.include? obj assert_include collection, obj

out, err = capture_io do do_somethingendassert_equal "output", outassert_equal "", err

assert_output "output", "" do do_somethingend

Why all these extra assertions?They're more expressive!

Monday, August 1, 11

Page 24: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Where is assert_nothing_raised?

Monday, August 1, 11

Page 25: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Same place as refute_silent.

Monday, August 1, 11

Page 26: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

refute_silentThis block of code must printsomething.What it is, I don't care.How is this assertion of value to anyone?Assert for the specific outputyou need.

Monday, August 1, 11

Page 27: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

assert_nothing_raisedThis block of code must do something.What it is, I don't care.How is this assertion of value to anyone?Assert for the specific result you need.

Monday, August 1, 11

Page 28: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Passes Without Implrequire "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_do_the_thing assert_nothing_raised do end endend

Monday, August 1, 11

Page 29: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Doesn't Validate Behaviorrequire "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_do_the_thing assert_nothing_raised do do_the_thing end endend

Monday, August 1, 11

Page 30: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Do This Insteadrequire "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_do_the_thing assert_equal 42, do_the_thing endend

Monday, August 1, 11

Page 31: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Do This Insteadrequire "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_do_the_thing assert_equal 42, do_the_thing endend If this raises, it's an error.

It's implied.

Monday, August 1, 11

Page 32: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Do This Insteadrequire "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_do_the_thing assert_equal 42, do_the_thing endend If this raises, it's an error.

It's implied.

Verifies behavior

Monday, August 1, 11

Page 33: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/spec

Monday, August 1, 11

Page 34: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Spec Examplerequire "minitest/autorun"

describe Thingy do it "must do the thing" do Thingy.do_the_thing.must_equal 42 endend

Monday, August 1, 11

Page 35: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Specs Transform:require "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_0001_must_do_the_thing Thingy.do_the_thing.must_equal 42 endend

Monday, August 1, 11

Page 36: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Specs Transform:require "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_0001_must_do_the_thing Thingy.do_the_thing.must_equal 42 endend

Simple Subclass

Monday, August 1, 11

Page 37: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Specs Transform:require "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_0001_must_do_the_thing Thingy.do_the_thing.must_equal 42 endend

Simple Subclass

Simple Method

Monday, August 1, 11

Page 38: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Specs Transform:require "minitest/autorun"

class TestThingy < MiniTest::Unit::TestCase def test_0001_must_do_the_thing Thingy.do_the_thing.must_equal 42 endend

Magic Free!

Simple Subclass

Simple Method

Monday, August 1, 11

Page 39: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

positive expectationsmust_bemust_be_close_tomust_be_emptymust_be_instance_ofmust_be_kind_ofmust_be_nilmust_be_same_asmust_be_silentmust_be_within_delta

must_be_within_epsilonmust_equalmust_includemust_matchmust_outputmust_raisemust_respond_tomust_sendmust_throw

Monday, August 1, 11

Page 40: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

negative expectationswont_bewont_be_close_towont_be_emptywont_be_instance_ofwont_be_kind_ofwont_be_nilwont_be_same_as

wont_be_within_deltawont_be_within_epsilonwont_equalwont_includewont_matchwont_respond_to

Monday, August 1, 11

Page 41: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

All for Freemust_equal is assert_equalwont_equal is refute_equal

etc.

Monday, August 1, 11

Page 42: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/mock

Monday, August 1, 11

Page 43: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Example@mock = MiniTest::[email protected] :meaning_of_life, [email protected]_of_life # => [email protected] # => true

Monday, August 1, 11

Page 44: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

But don’t use this if you don’t need it.

Monday, August 1, 11

Page 45: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Overmocking is evil

Monday, August 1, 11

Page 46: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

mock last• Mocks should be the last tool you grab.• The test should already be written.• It should already pass.• You only use mocks to detach from slow

or unstable external resources.

Monday, August 1, 11

Page 47: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

mock high• Don't mock a socket.• Mock your reader method.• Mock your library, not the protocol.

Monday, August 1, 11

Page 48: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

• Make sure your tests can fail.• Otherwise, they're useless.• I see this alot.

mock smart

Monday, August 1, 11

Page 50: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

“def is my stub framework”Phil Hagelberg

obj = Thing.new

def obj.timestamp Time.now + 10end

refute obj.done?

Monday, August 1, 11

Page 51: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Use Liskov Substitution Principal (aka testing with subclasses)

class IRC def read; ... endend

class TestIRC < IRC def read "happy" endend

assert_equal "happy", @irc.next_line

Monday, August 1, 11

Page 52: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Resist Mocks via Design

Designs that don't need mocking >Designs that do need mocking

Monday, August 1, 11

Page 53: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/pride

Monday, August 1, 11

Page 54: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Simple IO Pipelining

Monday, August 1, 11

Page 55: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Implementationclass PrideIO def initialize io @io = io end

def print o # ... end

def method_missing msg, *args @io.send msg, *args endend

MiniTest::Unit.output = PrideIO.new(MiniTest::Unit.output)

Monday, August 1, 11

Page 56: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Other Pipeline Ideas• Plug it into a GUI.

• Emit to Growl or other notifiers.

• Record test statistics.

Monday, August 1, 11

Page 57: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/bench

Monday, August 1, 11

Page 58: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/unit example:require 'minitest/benchmark' if ENV["BENCH"]

def bench_algorithm assert_performance_linear 0.9999 do |x| @obj.algorithm endend

Monday, August 1, 11

Page 59: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/spec example:require 'minitest/benchmark' if ENV["BENCH"]

describe "my class" do if ENV["BENCH"] then bench_performance_linear "fast_algorithm", 0.9999 do @obj.fast_algorithm end endend

Monday, August 1, 11

Page 60: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

0

7,500.00

15,000.00

22,500.00

30,000.00

0 2.5 5.0 7.5 10.0

y = 0.9674e1.0045xR² = 0.9999

N T12345678910

2.947.20

20.2554.75

148.39403.49

1,096.742,980.778,102.98

22,026.38

Curve Fitting

Monday, August 1, 11

Page 61: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

0

7,500.00

15,000.00

22,500.00

30,000.00

0 2.5 5.0 7.5 10.0

y = 0.9674e1.0045xR² = 0.9999

N T12345678910

2.947.20

20.2554.75

148.39403.49

1,096.742,980.778,102.98

22,026.38

Curve Fitting

Don't Test This

Monday, August 1, 11

Page 62: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

0

7,500.00

15,000.00

22,500.00

30,000.00

0 2.5 5.0 7.5 10.0

y = 0.9674e1.0045xR² = 0.9999

N T12345678910

2.947.20

20.2554.75

148.39403.49

1,096.742,980.778,102.98

22,026.38

Curve Fitting

Don't Test This

Test This

Monday, August 1, 11

Page 63: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/unit methodsassert_performance_constantassert_performance_exponentialassert_performance_linearassert_performance_powerassert_performance - Write your own!

Monday, August 1, 11

Page 64: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/spec methodsbench_performance_constantbench_performance_exponentialbench_performance_linearbench - Write your own!

Monday, August 1, 11

Page 65: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Extending

Monday, August 1, 11

Page 66: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Baconpalindrome = lambda { |obj| obj == obj.reverse }

it 'should be a palindrome' do @ary.should.be.a palindromeend

Monday, August 1, 11

Page 67: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/unitdef assert_palindrome obj assert_equal obj, obj.reverseend

assert_palindrome @ary

Monday, August 1, 11

Page 68: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/specdef must_be_palindrome self.must_equal self.reverseend

# or:

infect_an_assertion(:assert_palindrome, :must_be_palindrome)

@ary.must_be_palindrome

Monday, August 1, 11

Page 69: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Other Examples• rubygems uses:

• assert_path_exists

• refute_path_exists

• assert_satisfied_by ver, req

• assert_resolve expected, *specs

Monday, August 1, 11

Page 70: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Minitest Design Rationale

Monday, August 1, 11

Page 71: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Less is More

Monday, August 1, 11

Page 72: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Indirection is the Enemy

Monday, August 1, 11

Page 73: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/unit:assert_in_delta

def assert_in_delta exp, act, delta = 0.001, msg = nil n = (exp - act).abs msg = message(msg) { "Expected #{exp} - #{act} (#{n}) to be < #{delta}" } assert delta >= n, msgend

Monday, August 1, 11

Page 74: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/unit:assert_in_delta

def assert_in_delta exp, act, delta = 0.001, msg = nil n = (exp - act).abs msg = message(msg) { "Expected #{exp} - #{act} (#{n}) to be < #{delta}" } assert delta >= n, msgend message takes a

block to defer calculation until an

assertion fails

Monday, August 1, 11

Page 75: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/unit:assert_in_delta

def assert_in_delta exp, act, delta = 0.001, msg = nil n = (exp - act).abs msg = message(msg) { "Expected #{exp} - #{act} (#{n}) to be < #{delta}" } assert delta >= n, msgend

simple assertion is all that is needed

message takes a block to defer

calculation until an assertion fails

Monday, August 1, 11

Page 76: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/unit:assert_in_delta

def assert_in_delta exp, act, delta = 0.001, msg = nil n = (exp - act).abs msg = message(msg) { "Expected #{exp} - #{act} (#{n}) to be < #{delta}" } assert delta >= n, msgend

Only 2 other methods need to be understood:assert (9) & message (6)

simple assertion is all that is needed

message takes a block to defer

calculation until an assertion fails

Monday, August 1, 11

Page 77: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

minitest/spec:n.must_be_close_to m

(This page intentionally left blank)

Monday, August 1, 11

Page 78: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

class Object def should(*args, &block) Should.new(self).be(*args, &block) endend

class Should def method_missing(name, *args, &block) name = "#{name}?" if name.to_s =~ /\w[^?]\z/ desc = # ...

satisfy(desc) { |x| x.__send__(name, *args, &block) } endend

class Numeric def close?(to, delta) (to.to_f - self).abs <= delta.to_f rescue false endend

bacon:n.should.be.close m, delta

Monday, August 1, 11

Page 79: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

class Object def should(*args, &block) Should.new(self).be(*args, &block) endend

class Should def method_missing(name, *args, &block) name = "#{name}?" if name.to_s =~ /\w[^?]\z/ desc = # ...

satisfy(desc) { |x| x.__send__(name, *args, &block) } endend

class Numeric def close?(to, delta) (to.to_f - self).abs <= delta.to_f rescue false endend

bacon:n.should.be.close m, delta

1. Object#should

Monday, August 1, 11

Page 80: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

class Object def should(*args, &block) Should.new(self).be(*args, &block) endend

class Should def method_missing(name, *args, &block) name = "#{name}?" if name.to_s =~ /\w[^?]\z/ desc = # ...

satisfy(desc) { |x| x.__send__(name, *args, &block) } endend

class Numeric def close?(to, delta) (to.to_f - self).abs <= delta.to_f rescue false endend

bacon:n.should.be.close m, delta

2. Should#new

1. Object#should

Monday, August 1, 11

Page 81: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

class Object def should(*args, &block) Should.new(self).be(*args, &block) endend

class Should def method_missing(name, *args, &block) name = "#{name}?" if name.to_s =~ /\w[^?]\z/ desc = # ...

satisfy(desc) { |x| x.__send__(name, *args, &block) } endend

class Numeric def close?(to, delta) (to.to_f - self).abs <= delta.to_f rescue false endend

bacon:n.should.be.close m, delta

3. Should#close

2. Should#new

1. Object#should

Monday, August 1, 11

Page 82: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

class Object def should(*args, &block) Should.new(self).be(*args, &block) endend

class Should def method_missing(name, *args, &block) name = "#{name}?" if name.to_s =~ /\w[^?]\z/ desc = # ...

satisfy(desc) { |x| x.__send__(name, *args, &block) } endend

class Numeric def close?(to, delta) (to.to_f - self).abs <= delta.to_f rescue false endend

bacon:n.should.be.close m, delta

4. Should#satisfy

3. Should#close

2. Should#new

1. Object#should

Monday, August 1, 11

Page 83: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

class Object def should(*args, &block) Should.new(self).be(*args, &block) endend

class Should def method_missing(name, *args, &block) name = "#{name}?" if name.to_s =~ /\w[^?]\z/ desc = # ...

satisfy(desc) { |x| x.__send__(name, *args, &block) } endend

class Numeric def close?(to, delta) (to.to_f - self).abs <= delta.to_f rescue false endend

bacon:n.should.be.close m, delta

5. Numeric#close?

4. Should#satisfy

3. Should#close

2. Should#new

1. Object#should

Monday, August 1, 11

Page 84: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

class Object def should(*args, &block) Should.new(self).be(*args, &block) endend

class Should def method_missing(name, *args, &block) name = "#{name}?" if name.to_s =~ /\w[^?]\z/ desc = # ...

satisfy(desc) { |x| x.__send__(name, *args, &block) } endend

class Numeric def close?(to, delta) (to.to_f - self).abs <= delta.to_f rescue false endend

bacon:n.should.be.close m, delta

5. Numeric#close?

4. Should#satisfy

3. Should#close

2. Should#new

1. Object#should

Only 7 methods really need to be understood (50 loc):Kernel.describe (3); Context: it (6), should (7); Should: be (8) satisfy (14), method_missing (9); Numeric.close? (3)

Monday, August 1, 11

Page 85: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

test/unit v1:assert_in_delta

publicdef assert_in_delta(expected_float, actual_float, delta, message="") _wrap_assertion do {expected_float => "first float", actual_float => "second float", delta => "delta"}.each do |float, name| assert_respond_to(float, :to_f, "The arguments must respond to to_f; the #{name} did not") end assert_operator(delta, :>=, 0.0, "The delta should not be negative") full_message = build_message(message, <<EOT, expected_float, actual_float, delta)<?> and<?> expected to be within<?> of each other.EOT assert_block(full_message) { (expected_float.to_f - actual_float.to_f).abs <= delta.to_f } endend

Monday, August 1, 11

Page 86: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

test/unit v1:assert_in_delta

publicdef assert_in_delta(expected_float, actual_float, delta, message="") _wrap_assertion do {expected_float => "first float", actual_float => "second float", delta => "delta"}.each do |float, name| assert_respond_to(float, :to_f, "The arguments must respond to to_f; the #{name} did not") end assert_operator(delta, :>=, 0.0, "The delta should not be negative") full_message = build_message(message, <<EOT, expected_float, actual_float, delta)<?> and<?> expected to be within<?> of each other.EOT assert_block(full_message) { (expected_float.to_f - actual_float.to_f).abs <= delta.to_f } endend

Need to understand 160 loc:

_wrap_assertion (14), assert_respond_to (15), assert_operator (12), build_message (4+94: AssertionMessage, AssertionMessage::Literal, AssertionMessage::Template and many methods), assert_block (7)

Monday, August 1, 11

Page 87: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

test/unit v2:assert_in_delta

publicdef assert_in_delta(expected_float, actual_float, delta, message="") _wrap_assertion do _assert_in_delta_validate_arguments(expected_float, actual_float, delta) full_message = _assert_in_delta_message(expected_float, actual_float, delta, message) assert_block(full_message) do (expected_float.to_f - actual_float.to_f).abs <= delta.to_f end endend

Monday, August 1, 11

Page 88: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

test/unit v2:assert_in_delta

publicdef assert_in_delta(expected_float, actual_float, delta, message="") _wrap_assertion do _assert_in_delta_validate_arguments(expected_float, actual_float, delta) full_message = _assert_in_delta_message(expected_float, actual_float, delta, message) assert_block(full_message) do (expected_float.to_f - actual_float.to_f).abs <= delta.to_f end endend

Looks better, but now you need to understand ~308 loc:

_assert_in_delta_validate_arguments (14), _assert_in_delta_validate_arguments (35), _wrap_assertion (14), assert_respond_to (16), assert_operator (12), build_message (4+192!), assert_block (7)

Monday, August 1, 11

Page 89: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Simplified test/unit:assert_in_delta

publicdef assert_in_delta(expected_float, actual_float, delta, message="") _wrap_assertion do assert_respond_to(expected_float, :to_f, "The arguments must respond to to_f; the first did not") assert_respond_to(actual_float, :to_f, "The arguments must respond to to_f; the second did not") assert_respond_to(delta, :to_f, "The arguments must respond to to_f; the delta did not") assert_operator(delta, :>=, 0.0, "The delta should not be negative") assert_operator(expected_float.to_f - actual_float.to_f).abs, :<=, delta.to_f, message endend

Monday, August 1, 11

Page 90: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Simplified test/unit:assert_in_delta

publicdef assert_in_delta(expected_float, actual_float, delta, message="") _wrap_assertion do assert_respond_to(expected_float, :to_f, "The arguments must respond to to_f; the first did not") assert_respond_to(actual_float, :to_f, "The arguments must respond to to_f; the second did not") assert_respond_to(delta, :to_f, "The arguments must respond to to_f; the delta did not") assert_operator(delta, :>=, 0.0, "The delta should not be negative") assert_operator(expected_float.to_f - actual_float.to_f).abs, :<=, delta.to_f, message endend

simple assertion

Monday, August 1, 11

Page 91: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Simplified test/unit:assert_in_delta

publicdef assert_in_delta(expected_float, actual_float, delta, message="") _wrap_assertion do assert_respond_to(expected_float, :to_f, "The arguments must respond to to_f; the first did not") assert_respond_to(actual_float, :to_f, "The arguments must respond to to_f; the second did not") assert_respond_to(delta, :to_f, "The arguments must respond to to_f; the delta did not") assert_operator(delta, :>=, 0.0, "The delta should not be negative") assert_operator(expected_float.to_f - actual_float.to_f).abs, :<=, delta.to_f, message endend

simple assertion no loops

Monday, August 1, 11

Page 92: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Simplified test/unit:assert_in_delta

publicdef assert_in_delta(expected_float, actual_float, delta, message="") _wrap_assertion do assert_respond_to(expected_float, :to_f, "The arguments must respond to to_f; the first did not") assert_respond_to(actual_float, :to_f, "The arguments must respond to to_f; the second did not") assert_respond_to(delta, :to_f, "The arguments must respond to to_f; the delta did not") assert_operator(delta, :>=, 0.0, "The delta should not be negative") assert_operator(expected_float.to_f - actual_float.to_f).abs, :<=, delta.to_f, message endend

Need to understand 50 loc:

_wrap_assertion (14), assert_respond_to (15), assert_operator (12)

simple assertion no loops

Monday, August 1, 11

Page 93: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

rspec:n.should be_close(m, d)

Monday, August 1, 11

Page 94: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

rspec:n.should be_close(m, d)

Monday, August 1, 11

Page 95: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

rspec:n.should be_close(m, d)

I'm not smart enough

Monday, August 1, 11

Page 96: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Test Framework Comparisons

Monday, August 1, 11

Page 97: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Positive and Negative Tests(1,000 Tests, each)

framework pos (s) multiple neg (s) multiple avgbacon 0.15 (1.00 x) 0.45 (1.50 x) (1.25 x)

minitestunit 0.25 (1.67 x) 0.30 (1.00 x) (1.33 x)minitestspec 0.25 (1.67 x) 0.38 (1.27 x) (1.47 x)

rspec 0.58 (3.87 x) 0.63 (2.10 x) (2.98 x)rspec1 0.41 (2.73 x) 1.13 (3.77 x) (3.25 x)

testunit1 0.25 (1.67 x) 1.47 (4.90 x) (3.28 x)shoulda 1.15 (7.67 x) 2.45 (8.17 x) (7.92 x)

testunit2 0.81 (5.40 x) 3.21 (10.70 x) (8.05 x)cucumber 3.05 (20.33 x) 3.74 (12.47 x) (16.40 x)

Monday, August 1, 11

Page 98: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Positive Test Time(in multiples of bacon) :D

bacon

minitestunit

minitestspec

testunit1

rspec2

testunit2

shoulda

cucumber 20.33

7.67

5.40

3.87

1.67

1.67

1.67

1.00

Monday, August 1, 11

Page 99: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Lines of Code Executed (trace = 1 test)

minitestunit

minitestspec

testunit1

shoulda

bacon

testunit2

rspec

cucumber 88,228.00

36,434.00

24,607.00

17,378.00

13,581.00

12,099.00

10,306.00

9,903.00

Monday, August 1, 11

Page 100: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Startup Time(100 runs w/ 1 test, in sec)

testunit1

bacon

minitestunit

minitestspec

shoulda

testunit2

rspec2

cucumber 22.43

14.70

9.94

8.03

7.35

7.30

6.86

5.83

Monday, August 1, 11

Page 101: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Startup Time(100 runs w/ 1 test, in sec)

testunit1

bacon

minitestunit

minitestspec

shoulda

testunit2

rspec2

cucumber 22.43

14.70

9.94

8.03

7.35

7.30

6.86

5.83 test/unit bypasses rubygems

Monday, August 1, 11

Page 102: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Lines of Code(including dependencies)

bacon

minitest

shoulda

test-unit2

rspec2

cucumber 17430

7484

6381

4236

1166

380

Monday, August 1, 11

Page 103: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Lines of Code(including dependencies)

bacon

minitest

shoulda

test-unit2

rspec2

cucumber 17430

7484

6381

4236

1166

380

+ 62,985 lines of C!

Monday, August 1, 11

Page 104: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Flog (Complexity) Score(including dependencies)

bacon

minitest

shoulda

test-unit2

rspec

cucumber 104803

7877

5206

2412

947

456

Monday, August 1, 11

Page 105: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Flog (Complexity) Score(including dependencies)

bacon

minitest

shoulda

test-unit2

rspec

cucumber 104803

7877

5206

2412

947

456

doesn't count C

Monday, August 1, 11

Page 106: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

All of this is very important to me…

But…

Monday, August 1, 11

Page 107: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

But the #1 thing to improve your life is not technology!

Monday, August 1, 11

Page 108: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Stop using pre-ground grocery

store black pepper!

Monday, August 1, 11

Page 109: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Fresh ground pepper is vastly

better, and cheap!

Monday, August 1, 11

Page 110: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

Finally,A

Special!anks

Monday, August 1, 11

Page 111: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

toGregory Brown

Monday, August 1, 11

Page 112: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

and myFosterKittens

Monday, August 1, 11

Page 113: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

they kept me sane during the

rubygems bullshit drama

Monday, August 1, 11

Page 114: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

without them, I probably wouldn't be speaking here today

Monday, August 1, 11

Page 115: Size Doesn’t Matter Ryan Davis, Seattle.rb Size Doesn’t Matter · 2019-11-09 · Cascadia Ruby Conf 2011 @ Seattle, Cascadia Size Doesn’t Matter Ryan Davis, Seattle.rb Positive

Cascadia Ruby Conf 2011 @ Seattle, Cascadia

Ryan Davis, Seattle.rbSize Doesn’t Matter

!ank You

Monday, August 1, 11