Efficient Rails Test-Driven
       Development

     Wolfram Arnold
    www.rubyfocus.biz

    In collaboration with:
Sara...
Class Outline

Week #1
  The economics of testing
  Testing in layers, design patterns
  Toolbox: RSpec with Rails
  RSpec...
Class Outline

Week #3
  Controller testing
  View, Helper, Routes Testing
  How much is enough? How much is too much?


W...
Class Outline

Week #5
  Integration Testing—when and how?
  Toolbox: Cucumber, Selenium & Friends
  Page Object Pattern

...
What you can expect

Presentation, Examples
Answers to questions
A range of material from current development
  practice
H...
It works best, when...

Active participation
Try something new
Focus
Team Effort
  Pairing
  Utilizing the resources in cl...
Efficient Rails Test-Driven
       Development
Why “efficient” and “testing”?

“Testing takes too much time.”
“It's more efficient to test later.”
“Testing is the respon...
The Role of Testing

Development without tests...
  fails to empower developers to efficiently take
    responsibility for...
TDD: Keeping cost of change low
Cost per change
                              without
                               TDD

...
Why?

Non-TDD
 Accumulates “technical debt” unchecked
 Removal of technical debt carries risk
    The more technical debt,...
Testing in Layers

 Application, Browser UI           Selenium


                              RSpec Integration       Tes...
Cost of Testing
                           Layers


 Application, Browser UI



   Application, Server



 Views          ...
Cost of Testing
                           Relationship to data


                           most
 Application, Browser UI...
Best ROI for Testing
                           Layers


 Application, Browser UI



   Application, Server



 Views     ...
TDD & Design Patterns

Skinny Controller—   ➢   Designed to move logic
 Fat Model               from higher to lower
DRY  ...
Structure of Tests

Setup
Expected value
Actual value
Verification: actual == expected?
Teardown
Good Tests are...

Compact
Responsible for testing one concern only
Fast
DRY
RSpec Verifications

should respond_to
should be_nil
   → works with any ? method (so-called “predicates”)
should be_valid...
RSpec Structure

before, before(:each), before(:all)
after, after(:each), after(:all)
describe do...end, nested
it do... e...
Let's do some coding

Demo
Models: What to test?

Validation Rules
Associations
Any custom method
Association Proxy Methods
Let's do some coding

Exercise, but wait...
Test-First Teaching

Pioneered by Sarah Allen
  Instructor writes tests
  Students write code


What about writing tests?
Behavior-First Teaching

Instructor specifies desired behavior
  in plain English
  like a user story
Students write tests...
Story Exercise #1

A Person object must have a first and last name.
A Person object can construct a full name from
  the f...
RSpec ==, eql, equal

obj.should == 5            5 == 5
obj.should eql(5)          5.eql 5
obj.should equal(5)        5.eq...
RSpec should change

lambda {
  Person.create
}.should change(Person, :count).by(1)


lambda {
  @bob.addresses.create(:st...
RSpec should change

lambda {
  # code that causes a change
}.should change(object, :method).by(difference)
or
should chan...
should change with block

lambda {
  # code that causes a change
}.should change { expression }.by(difference)
or
should c...
better with block

lambda {
  @bob.addresses.create(:street => “...”)
}.should change {
  @bob.addresses(true).count }.by(...
Homework

A Person should save correctly.
A Person can have many Addresses.
A Person's Address must have a street, city an...
BizConf

                                Aug 4-6, 2010
                                Amelia Island, FL
                 ...
Upcoming SlideShare
Loading in...5
×

2010-07-19_rails_tdd_week1

1,881

Published on

Efficient Rails Test-Driven Development Week #1. A class by Wolfram Arnold of rubyfocus.biz, in collaboration with Sarah Allen of blazingcloud.net and marakana.com

Published in: Technology
0 Comments
7 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,881
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
267
Comments
0
Likes
7
Embeds 0
No embeds

No notes for slide

2010-07-19_rails_tdd_week1

  1. 1. Efficient Rails Test-Driven Development Wolfram Arnold www.rubyfocus.biz In collaboration with: Sarah Allen, BlazingCloud.net marakana.com
  2. 2. Class Outline Week #1 The economics of testing Testing in layers, design patterns Toolbox: RSpec with Rails RSpec & Models Week #2 A culture of testing: Why TDD? How to TDD? Testing & Data Dependencies Toolbox: Fixtures, Factories, Mocks & Stubs
  3. 3. Class Outline Week #3 Controller testing View, Helper, Routes Testing How much is enough? How much is too much? Week #4 Refactoring code & tests, custom matchers API Testing Remote data setup Cucumber for API testing & documentation
  4. 4. Class Outline Week #5 Integration Testing—when and how? Toolbox: Cucumber, Selenium & Friends Page Object Pattern Week #6 TDD—what next? BDD, Agile Process, XP → VDD: Value-Driven Development Advanced/Special Requests
  5. 5. What you can expect Presentation, Examples Answers to questions A range of material from current development practice Homework Fluidity & adaptability Fun
  6. 6. It works best, when... Active participation Try something new Focus Team Effort Pairing Utilizing the resources in class: TA's, participants Discussions in public Class Q&A Mailing list
  7. 7. Efficient Rails Test-Driven Development
  8. 8. Why “efficient” and “testing”? “Testing takes too much time.” “It's more efficient to test later.” “Testing is the responsibility of QA, not developers.” “It's not practical to test X.” Tests break when data changes. Tests break when design changes.
  9. 9. The Role of Testing Development without tests... fails to empower developers to efficiently take responsibility for quality of the code delivered makes collaboration harder build narrow silos of expertise instills fear & resistance to change makes documentation a chore stops being efficient very soon
  10. 10. TDD: Keeping cost of change low Cost per change without TDD with TDD Time
  11. 11. Why? Non-TDD Accumulates “technical debt” unchecked Removal of technical debt carries risk The more technical debt, the higher the risk Existing technical debt attracts more technical debt Like compound interest People are most likely to do what others did before them To break the pattern heroic discipline & coordination required
  12. 12. Testing in Layers Application, Browser UI Selenium RSpec Integration Test::Unit Integration Application, Server Cucumber, Webrat RSpec RSpec Views Helpers Views Helpers RSpec RSpec Test::Unit Functional Controller Routes Controller Routes RSpec Test::Unit Model Model
  13. 13. Cost of Testing Layers Application, Browser UI Application, Server Views Helpers Controller Routes Model Cost
  14. 14. Cost of Testing Relationship to data most Application, Browser UI removed Application, Server Views Helpers Controller Routes Model closest Cost
  15. 15. Best ROI for Testing Layers Application, Browser UI Application, Server Views Helpers Controller Routes Model Impact/Line of Test Code
  16. 16. TDD & Design Patterns Skinny Controller— ➢ Designed to move logic Fat Model from higher to lower DRY application layers named_scope ➢ Following design patterns makes testing Proxy Associations easier Validations ➢ Code written following ... TDD economics will naturally converge on these design patterns!
  17. 17. Structure of Tests Setup Expected value Actual value Verification: actual == expected? Teardown
  18. 18. Good Tests are... Compact Responsible for testing one concern only Fast DRY
  19. 19. RSpec Verifications should respond_to should be_nil → works with any ? method (so-called “predicates”) should be_valid should_not be_nil; should_not be_valid lambda {...}.should change(), {}, .from().to(), .by() should eql, ==, equal
  20. 20. RSpec Structure before, before(:each), before(:all) after, after(:each), after(:all) describe do...end, nested it do... end
  21. 21. Let's do some coding Demo
  22. 22. Models: What to test? Validation Rules Associations Any custom method Association Proxy Methods
  23. 23. Let's do some coding Exercise, but wait...
  24. 24. Test-First Teaching Pioneered by Sarah Allen Instructor writes tests Students write code What about writing tests?
  25. 25. Behavior-First Teaching Instructor specifies desired behavior in plain English like a user story Students write tests Students write code to make tests pass
  26. 26. Story Exercise #1 A Person object must have a first and last name. A Person object can construct a full name from the first and last name. A Person object has an optional middle name. A Person object returns a full name including, if present, the middle name.
  27. 27. RSpec ==, eql, equal obj.should == 5 5 == 5 obj.should eql(5) 5.eql 5 obj.should equal(5) 5.equal 5 Object Equality vs. Identity Use == eql, == compare values Unless you know you need something else equal, === compare objects, classes Warning! Do not use != with RSpec. Use should_not instead.
  28. 28. RSpec should change lambda { Person.create }.should change(Person, :count).by(1) lambda { @bob.addresses.create(:street => “...”) }.should change(@bob.addresses, :count).by(1) nd Warning: The 2 example is incorrect!
  29. 29. RSpec should change lambda { # code that causes a change }.should change(object, :method).by(difference) or should change(object, :method).from(initial).to(final) The object typically is a class, if not, be wary of reload!
  30. 30. should change with block lambda { # code that causes a change }.should change { expression }.by(difference) or should change { expression }.from(initial).to(final)
  31. 31. better with block lambda { @bob.addresses.create(:street => “...”) }.should change { @bob.addresses(true).count }.by(1)
  32. 32. Homework A Person should save correctly. A Person can have many Addresses. A Person's Address must have a street, city and zip. A Person's Address can have an optional country. If the country is left blank, it should default to “USA” prior to saving.
  33. 33. BizConf Aug 4-6, 2010 Amelia Island, FL Discount code: WOLF Rails & Web App Professionals, Entrepreneurs, for 43% off Consultants http://bizconf.org? Small group coupon=WOLF Network with Who's Who Organized by Obie Fernandez of Hashrocket Highlight: David Allen
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×