behavior-driven development with...

76
Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional Ruby Conference 2008 1

Upload: others

Post on 22-Sep-2020

0 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Behavior-Driven Development with RSpec

Hosted by Pat MaddoxProfessional Ruby Conference 2008

1

Page 2: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Before we begin...

• sudo gem install rspec-rails

• sudo gem install cucumber

• git clone git://github.com/pat-maddox/blackjack.git

2

Page 3: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Why are you here?

• You need another *DD in your life (BDD, in our case)

• You’re interested in testing

• You want to know how RSpec will make your life better

3

Page 4: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Why am I here?

• I’ve been using RSpec daily for over 2 years

• Core team member, and author of a way-late book from AW

• I love talking about this stuff!!!!

4

Page 5: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

What will you learn?

• RSpec’s major components

• BDD rhythm

• Acceptance testing with Cucumber

• “Outside-in”

5

Page 6: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Two Underlying Goals

• Clean code that works

• Clean software that works

6

Page 7: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

PROFIT

7

Page 8: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Lots of Kinds of Tests

• We care about

• Developer Tests

• Customer Tests

8

Page 9: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Developer Tests

• We own them

• Verify that our code works right

• Design tool

• Unit Tests

• Integration Tests

9

Page 10: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Customer Tests

• Customer owns them

• with our collaboration

• Verify that our code does the right work

• Acceptance Tests

10

Page 11: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

RSpec: 4 frameworks in 1

• Expectations framework

• Example framework

• Mock objects framework

• Acceptance testing (provided by Cucumber)

11

Page 12: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Expectations Framework

• Expectations: verification

• Matchers: what to verify

• Natural language-ish

• Focus on behavior

12

Page 13: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

13

Page 14: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Expectations & Matchers

• 1.should_not == 2

• team.should have(11).players

• lambda { 100/0 }.should raise_error

14

Page 15: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

15

Page 16: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Custom Matchers

• You can define custom matchers if none of the built in ones suit you

• Standard custom matchers

• Simple matcher

16

Page 17: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

17

Page 18: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

18

Page 19: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Example Framework

• Specification, not verification

• Specification by example

• Developer testing / unit testing

19

Page 20: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

20

Page 21: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

“Everyone knows that specific events have a vividness which imprints them so strongly on the memory that they can later be used as models for other events which are like them in some way. Thus in each specific event, there is the

germ of a whole class of similar events.”- Douglas Hofstadter, GED

21

Page 22: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Your brain understands examples

22

Page 23: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

• Math.sqrt(9).should == 3

• Math.sqrt(16).should == 4

• Math.sqrt(25).should == ??

23

Page 24: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

• Used for organizing examples

• Encourage you to keep code modular

• Final piece of specifying behavior - these are the full specification

Example Groups

24

Page 25: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

25

Page 26: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

• Provide before() callback for setting up context

• Provide after() callback for cleanup

• Can be nested to share context

26

Page 27: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

27

Page 28: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Shared Example Groups

• Refactor your specs!

• Great for extracting commonalities in specs

28

Page 29: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

29

Page 30: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Good examples are

• Clear

• Concise

• Isolated

• Fast

30

Page 31: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Simple Code

• Passes all the tests

• Reveals all the intention

• No duplication

• Fewest number of classes or methods

- Kent Beck

31

Page 32: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

The BDD Cyclered - green - refactor

32

Page 33: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Encapsulated Thinking

• Encapsulation - separating “what to do” from the details of “how to do it”

• BDD cycle

• Red - what to do

• Green - how to do it

• Refactor - how to do it better

33

Page 34: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Red

34

Page 35: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

35

Page 36: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Green

36

Page 37: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

37

Page 38: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Refactor

38

Page 39: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Red

39

Page 40: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

40

Page 41: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Green

41

Page 42: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

42

Page 43: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Refactor

43

Page 44: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

44

Page 45: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Don’t forget to refactor!!!!!!

45

Page 46: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Exercise: Feeling the Flow

• git clone git://github.com/pat-maddox/blackjack.git

• git co -b just_specs origin/just_specs

• ruby spec/hand_spec.rb # or autospec

46

Page 47: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Acceptance Tests

• Specifications of the system’s behavior

• Written in domain terms

• Maintained by customer and developer

47

Page 48: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Clean Software

• Runs all the tests

• Focuses on the domain, hides infrastructure

• Every feature provides business value

48

Page 49: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Communication & Responsibility

49

Page 50: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

50

Page 51: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

51

Page 52: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

System Specs

• Typically use the outer API of the system

• execute binary for command line apps

• web apps: in-browser, or HTTP requests

• Focus on inputs to the system, outputs and side-effects

• account balance changes

• email notification sent to admin

52

Page 53: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Implementation Levels

• Model

• Controller API

• Browser using Selenium/Watir

53

Page 54: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

How to Write Good Stories

• Use domain language

• Ubiquitous language - Evans, DDD

• No mention of infrastructure

• Imperative vs Declarative

54

Page 55: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

55

Page 56: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

56

Page 57: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

BAD57

Page 58: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Imperative vs Declarative

• Imperative

• Fine-grained

• Coupled to implementation

• Declarative

• Coarse-grained

• Less coupled

58

Page 59: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Imperative

59

Page 60: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Declarative

60

Page 61: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Which style to use?

• In general I prefer declarative. Less noise

• Imperative can be good for very sequential scenarios

• Try to capture the essence of the scenario

• WHICHEVER THE CUSTOMER WANTS

61

Page 62: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Semantic Elements

• Given

• Used for setting up state, assumptions

• When

• The action taking place

• Then

• Expectations are verified against resulting state

62

Page 63: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

63

Page 64: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Focus on Business Value

• Pop the “why” stack

• Business value: how does this feature

• make us money?

• save us money?

• protect valuable assets?

64

Page 65: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

A user should enter his phone number when checking out.Why?

So that we can call them to verify the orderWhy?

So that we can minimize fraudWhy?

So that we don’t lose money from fraudulent orders.

65

Page 66: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Feature Narrative

• Explains business value

• States actionable feature

• May include pertinent roles

66

Page 67: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

67

Page 68: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

68

Page 69: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

69

Page 70: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

70

Page 71: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Exercise: Writing features for Blackjack

• When player wins he should be paid 1-1

• When player loses, he is not paid

• When player has blackjack, he is paid 1.5-1

71

Page 72: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

The full BDD workflow

72

Page 73: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Outside-In

• Begin with outer edges of app

• Write examples to drive design, mocking dependencies in the layer below

• When you finish the outer layer, spec out the supporting objects

73

Page 74: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

Exercise: Implementing a feature Outside-In

• git co -b cucumber origin/cucumber

• git merge just_specs # (or origin/aces_solution if you did not finish)

• cucumber features/play_game.feature

74

Page 75: Behavior-Driven Development with RSpecptgmedia.pearsoncmg.com/imprint_downloads/voicesthatmatter/rub… · Behavior-Driven Development with RSpec Hosted by Pat Maddox Professional

75