Upload
jason-noble
View
598
Download
3
Tags:
Embed Size (px)
DESCRIPTION
An introduction to Test Driven Development and Behavior Driven Development
Citation preview
Test Driven DesignBehavior Driven Design
Jason [email protected]
Test Driven Design
• TDD is a software development practice that relies on the repetition of a very short development cycle– Write a failing test that defines a desired
improvement or new function– Write the minimum code possible to make the test
pass– Refactor the code to acceptable standards
Red Green Refactor
• Write a failing test (Red)
• Make the test pass (Green)
• Refactor tests or code (NOT both!)
Why use TDD?
• Helps you break problems down into small manageable tasks
• Writing tests takes the fear out of programming
• Writing tests helps you communicate what your code SHOULD do/accomplish
TDD Example
• What can a calculator do?– Add– Subtract– Multiply– Divide– Equals– Percent
– Square Root– On / Off– Memory Clear– Memory Set– Memory Recall– Negative numbers– Decimals
Write a failing test (Red)
• Write a failing test# spec/calculator_spec.rbrequire ’./calculator’
describe Calculator doend
• Failure:spec/calculator_spec.rb:1:in `require': cannot load such file – ./calculator (LoadError)
Make the test pass (Green)
• Write code to make the test pass
touch calculator.rb
• Test Failure
spec/calculator_spec.rb:3:in `<top (required)>': uninitialized constant Calculator (NameError)
Make the test pass (Green)
• Write code to make the test pass
# calculator.rbclass Calculatorend
• Test Success
No examples found.
Finished in 0.00005 seconds0 examples, 0 failures
What did we do?
• Write a very simple test• Got a LoadError• Fixed the LoadError• Got a NameError• Fixed the NameError• Tests are green!• Refactor?
Add a test
# spec/calculator_spec.rb let(:calculator) { Calculator.new } it "can be created" do calculator.should be_a(Calculator) end
Tests are still green!Running: spec/calculator_spec.rb
Calculator can be created
Finished in 0.00127 seconds1 example, 0 failures
What did we do?
• Add a very simple test• Got no errors• Tests are green!• Refactor?
Add a test
# spec/calculator_spec.rb describe "#total" do it "returns 0 by default" do calculator.total.should == 0 end end
Tests are red!
Make the tests pass
• Add the minimum code to make the test fail in a different way (or succeed)
# calculator.rbdef totalend
Make the tests pass
• Write the MINIMUM code necessary to make the test pass
# calculator.rbdef total 0end
• Tests are GREEN!• Refactor?
What did we do?
• Write a very simple test (total.should == 0)• Got a NoMethod error• Fixed the NoMethodError• Got an unexpected result returned• Fixed the result to always return 0• Tests are green!• Refactor?
Behavior Driven Development
• Uses the basis of TDD, domain driven design and object oriented design to provide software developers and business analysts with shared tools in order to collaborate on software development
• TDD describes how the software works• BDD describes how the end user uses the
software
BDD Example
Scenario: User adds two positive numbers
Given I turn the calculator on,Then I should see zero on the screen
When I add 5And I add 7Then I should see 12 on the screen
Ruby Cucumber
• Uses regular expressions to match stepsGiven /I turn the calculator on/ do @calculator = Calculator.new @calculator.onendThen /I should see (\d+) on the screen/ do |expected_value|
@calculator.total.should == expected_valueendWhen /I add (\d+) / do |number|
@calculator.add(number)end
Further Readings
• Test Driven Development: By Example by Kent Beck
• Everyday Rails Testing with Rspec by Aaron Sumner
• The Cucumber Book by Matt Wynne and Aslak Hellesoy