Behaviour-Driven Development

Post on 10-May-2015

3.241 views 0 download

Tags:

description

Slides from a talk to Web21C SDK team.

Transcript of Behaviour-Driven Development

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