behaviour-driven development
DESCRIPTION
Slides from a talk to Web21C SDK team.TRANSCRIPT
Behaviour-Driven Development
Kerry Buckley
Evolution
Dirty Hacking
Automated Testing
Automated Testingclass Adder def add a, b a + b endend
class AdderTest < Test::Unit::TestCase def test_adder adder = Adder.new assert_equal 4, adder.add(2, 2) assert_equal 2, adder.add(4, -2) endend
Are You Really Testing Your Code?
class Adder def add a, b a + b endend
class AdderTest < Test::Unit::TestCase def test_adder assert_equal 4, 2 + 2 endend
Test-First Development
Test-First Development
Failingtests
Start Done
Writecode
Writetests
Test-Driven Development
Test-Driven Development
Failingtest
Cleancode
All tests pass
Refactor
State-Basedclass DongleTest < Test::Unit::TestCase def test_wibble # Set up test inputs dongle = Dongle.new dongle.addString("foo") dongle.addRemoteResource("http://foo.com/bar") # Exercise functionality under test dongle.wibble! # Verify results are as expected dongle.answer.should == 42 endend
Bottom-Up
Behaviour-Driven Development
Behaviour-Driven Development
Verification Specification
State-based Interaction-based
Bottom-up Outside-in
Testing tool Design tool
Invention Discovery
More Descriptive Test Names
class AdderTest < Test::Unit::TestCase def test_should_add_two_positive_numbers assert_equal 4, Adder.new.add(2, 2) end def test_should_add_a_positive_and_a_negative_number assert_equal 2, Adder.new.add(4, -2) endend
Matchers
describe "An adder" do it "should add two positive numbers" do Adder.new.add(2, 2).should == 4 end it "should add a positive and a negative number" do Adder.new.add(4, -2).should == 2 endend
Generated Documentation
$ spec -f s adder_spec.rb
An adder- should add two positive numbers- should add a positive and a negative number
Finished in 0.005493 seconds
2 examples, 0 failures
More Matcher Examples
@string.should == "foo"
@array.should_not be_empty
@hash.should have_key(:foo)
@object.should be_an_instance_of String
lambda { @stack.pop }.should raise_error(StackUnderflowError)
Top-Down
Interaction-Based
Mock Objects
•Stand-ins for collaborating objects
•Mock the interface, not a specific object
•Verify that expected calls are made
•Not stubs!
•For your code only!
Classicists v Mockists
Mock Objects
MockMock MockMock
Boundary Objects
Integration Testing
Further ReadingIntroducing BDD (Dan North)http://dannorth.net/introducing-bdd
BDD Introductionhttp://behaviour-driven.org/Introduction
Mock Roles, Not Objects (Freeman, Mackinnon, Pryce, Walnes)http://www.jmock.org/oopsla2004.pdf
BDD in Ruby (Dave Astels)http://blog. daveastels.com/files/BDD_Intro.pdf