KEMBAR78
Behavior Driven Development (BDD) and Agile Testing | PPT
Agile Behaviour Driven Development (BDD) and Integrated Testing with the Cucumber Framework Damian Versaci  Melbourne ANZTB SIGIST, 15 th  June 2011
Contents The Importance of Requirements Behaviour Driven Development (BDD) Explained BDD Frameworks (Cucumber, JBehave etc) Structure of a Feature File (User Story) & Workflow Benefits Potential Pitfalls Image:  http://community.travelchinaguide.com/forum2.asp?i=58724
The Importance of Requirements NIST estimate 70% of defects are introduced in the requirements phase 1 Earlier Detected Defects, Cheaper to Correct but prevention even better Defining  & Managing Requirements is generally a difficult exercise Requirements Elicitation, Elaboration, Validation & Acceptance Requirements Traceability (Code & Tests) & Change Image:  http://www.jacobsen.no/anders/blog/archives/images/project.html 1  National Institute of Standards & Technology ( NIST) 2002 RTI Project 7007.011
Behaviour Driven Development (BDD) Explained Encourages Collaboration between Business Analysts, QA Engineers, Developers & Business Owners / Stakeholders Driven by Business Value Extends Test Driven Development (TDD) by utilizing natural language that non-technical stakeholders can understand BDD Frameworks such as Cucumber or JBehave are an Enabler, acting a “bridge” between Business & Technical Language User Stories & Acceptance Criteria Defined in Feature Files with Business Language Developers Implement Acceptance Criteria
BDD Frameworks (Cucumber, JBehave etc) Cucumber is designed for scenario implementation in Ruby, but supports other implementations JBehave is designed for scenario implementation in Java Highly Flexible, with ability to integrate with any tool supported by underlying implementation, e.g. Web Automation (Selenium / Waitr / Capybara) Various Languages (Java, .NET etc) with Cuke4Duke etc Build Systems – Ant, Rake, Hudson etc Various other Tools & Scripting toolkits
BDD Frameworks Basic .feature (User Story) Structure: Feature: [Title]  As a  [Role] I want  [Some Action]  So that  [Business Value] Scenario: Title Given  [Context] And [More Context] When  (I do) [Action] And [Other Action] Then  (I should see) [Outcome] And [More Outcomes] - Description of Feature - Stakeholder and/or User role Action to be taken by user. Business Value Provided Description of Scenario Preconditions of Scenario Actions taken in Scenario Outcome Expected One or more Scenarios defined
Structure of a Feature File & Agile Workflow Step 1: User Story / Requirement  Elicitation & Elaboration   with Customer(s) or Business Owner – Feature file output Step 2: User Story (Feature file) Elaboration &  Validation with QA Step 3: Feature & Feature File Implementation by  Developers Step 4: Testers Test Functionality Step 5: Acceptance by Business Owner Step 6: Repeat (In Event of Requirement Changes)
Structure of a Feature File & Agile Workflow Image: http://leankitkanban.com/Content/Images/Features/visualizeTheWorkStuckInQA.png
Structure of a Feature File & Agile Workflow Step 1: User Story / Requirement  Elicitation & Elaboration with Customer(s) and BA Feature File Output: Scenario: Import File Successfully Given  no data exists for today When  I import the file Then  the file data is stored successfully for future retrieval Scenario: View Usage Report Given  file import has been completed When  I generate a report for today Then  a report should be generated And I should see the data from the file in the  report fileimport.feature @story(“Report-01") @Ownership("BA") @wip Feature: Import Daily Data File  As a  Batch Data User I want  to import usage data files  So that  usage data is available  in reports
Structure of a Feature File & Agile Workflow Step 2:  Elaboration & Validation with BA & QA Engineer Feature File Output: Scenario: Data Already Exists Given   data exists for the imported file date When   I import the file Then   previously imported data is deleted And  the file data is stored successfully for future retrieval …  more scenarios … Scenario: View Usage Report Given  file import has been completed When  I generate a report  selecting a  specific date Then  a report should be generated And I should see data  for the date specified   fileimport.feature … feature… Scenario: Import File Successfully Given  no data exists  for the imported file date When  I import the file Then  the file data is stored successfully for future retrieval
Structure of a Feature File & Agile Workflow Step 3:  Developers Implement Functionality & Scenario  Acceptance Criteria  FileImport.rb …  Other Implementation details … Then /^I should see data for the date specified $/ do date = filefeed.date text = “Units Purchased = 15, Total Cost = $500.00” xpath="/descendant::header[@class='page'][#{page_number}]/h1"  Then "I should see \"#{text}\" within path \"#{xpath}\"" end Then /^(?:|I )should see \/([^\/]*)\/(?: within path "([^"]*)")?$/ do |regexpression, xpath|  regexp = Regexp.new(regexpression, {}, 'U')  if page.respond_to? :should  # Using Capybara Web Driver page.should have_xpath(xpath, :text => regexp)  else  assert page.has_xpath?(xpath, :text => regexp)  end end
Structure of a Feature File & Agile Workflow Step 4: Testers Test Functionality Exploratory Testing and / or Define own Cucumber Tests: Scenario: Import File Successfully Given  the following data exists | Date  | Units | Cost  | | 24-03-2010 | 0  | 0  | | 25-03-2010 | 12  | 500.00 | When  I import the file containing data | Date  | Units | Cost  | | 24-03-2010 | 6  | 200.00 | Then  the following data is stored for future retrieval | Date  | Units | Cost  | | 24-03-2010 | 6  | 200.00 | | 25-03-2010 | 12  | 500.00 | fileimport.feature @story(“Report-01") @Ownership(“QA") @wip Feature: Import Daily Data File  As a  Batch Data User I want  to import usage data files  So that  usage data is available in reports
Structure of a Feature File & Agile Workflow Step 4: Testers Continued Scenario: View Usage Report Given  file import has been completed When  I generate a report for <date> Then  a report should be generated And I should see <data> displayed Examples: | date  | data  | | 24-03-2010 | Units Purchased = 15, Total Cost = $500.00 | | 25-03-2010 | Units Purchased = 6, Total Cost = $200.00  |
Structure of a Feature File & Agile Workflow Step 5: Acceptance by Business Owner Confidence that Acceptance Criteria has been implemented via Scenario implementation, Automated Tests by Testers & Integrated with Build System Demo & Acceptance (Business Signoff) of Functionality Showcases
Structure of a Feature File & Agile Workflow Step 6: Repeat (In Event of Requirement Changes) Feature Files are Modified “Breaks the Build” Developers Implement new functionality to make tests “Pass” Testers test new functionality Business Owner Accepts Functionality Image: http://shirtoid.com/wp-content/uploads/2010/08/Bleh-Broccoli.jpg
Benefits Requirements are easy to understand for both Business Stakeholders and Technical Project Members Quality is “Built-in”, assessing requirements quality at the beginning of the process (Elicitation, Elaboration, Validation & Acceptance) Allows easy adaptation to requirements changes Testers can leverage and extend developers work Traceability is relatively easy Image: http://www.onlineweblibrary.com/news/cucumber.jpg
Potential Pitfalls BDD is a Mindset, Not a Set of Tools Tools are immature Requirements / Functionality Influenced by Consensus Not suitable for all project types Is Not a Replacement for Unit Testing Need to be Mindful of Stakeholders When Wording Features & Scenarios Make Sure Features are Broken Down into Sufficiently small “chunks” Image: http://1.bp.blogspot.com/_8M4A38LyBBs/SI4DVmgay5I/AAAAAAAAAdk/cqJ7Gx4-Bf8/s400/5.jpg
Further Reading The RSpec Book: Behaviour Driven Development with Rspec, Cucumber, and Friends http://www.amazon.com/RSpec-Book-Behaviour-Development-Cucumber/dp/1934356379 Cucumber Website -  http://cukes.info/ Cuke4Duke (Cucumber for Java) -  https://github.com/aslakhellesoy/cuke4duke/wiki JBehave Website -  http://jbehave.org/ Webrat (Web Driver) -  https://github.com/brynary/webrat/wiki Capybara (Web Driver that extends Webrat) http://rubydoc.info/github/jnicklas/capybara/master/file/README.rdoc http://www.allenwei.cn/cucumber-capybara-what-we-need-for-rails-integration-test/ HTMLUnit – Browser Simulation for Java:  http://htmlunit.sourceforge.net/ Culerity (Cucumber wrapper for HTMLUnit) -  https://github.com/langalex/culerity/wiki
Questions? Image: Clipart

Behavior Driven Development (BDD) and Agile Testing

  • 1.
    Agile Behaviour DrivenDevelopment (BDD) and Integrated Testing with the Cucumber Framework Damian Versaci Melbourne ANZTB SIGIST, 15 th June 2011
  • 2.
    Contents The Importanceof Requirements Behaviour Driven Development (BDD) Explained BDD Frameworks (Cucumber, JBehave etc) Structure of a Feature File (User Story) & Workflow Benefits Potential Pitfalls Image: http://community.travelchinaguide.com/forum2.asp?i=58724
  • 3.
    The Importance ofRequirements NIST estimate 70% of defects are introduced in the requirements phase 1 Earlier Detected Defects, Cheaper to Correct but prevention even better Defining & Managing Requirements is generally a difficult exercise Requirements Elicitation, Elaboration, Validation & Acceptance Requirements Traceability (Code & Tests) & Change Image: http://www.jacobsen.no/anders/blog/archives/images/project.html 1 National Institute of Standards & Technology ( NIST) 2002 RTI Project 7007.011
  • 4.
    Behaviour Driven Development(BDD) Explained Encourages Collaboration between Business Analysts, QA Engineers, Developers & Business Owners / Stakeholders Driven by Business Value Extends Test Driven Development (TDD) by utilizing natural language that non-technical stakeholders can understand BDD Frameworks such as Cucumber or JBehave are an Enabler, acting a “bridge” between Business & Technical Language User Stories & Acceptance Criteria Defined in Feature Files with Business Language Developers Implement Acceptance Criteria
  • 5.
    BDD Frameworks (Cucumber,JBehave etc) Cucumber is designed for scenario implementation in Ruby, but supports other implementations JBehave is designed for scenario implementation in Java Highly Flexible, with ability to integrate with any tool supported by underlying implementation, e.g. Web Automation (Selenium / Waitr / Capybara) Various Languages (Java, .NET etc) with Cuke4Duke etc Build Systems – Ant, Rake, Hudson etc Various other Tools & Scripting toolkits
  • 6.
    BDD Frameworks Basic.feature (User Story) Structure: Feature: [Title] As a [Role] I want [Some Action] So that [Business Value] Scenario: Title Given [Context] And [More Context] When (I do) [Action] And [Other Action] Then (I should see) [Outcome] And [More Outcomes] - Description of Feature - Stakeholder and/or User role Action to be taken by user. Business Value Provided Description of Scenario Preconditions of Scenario Actions taken in Scenario Outcome Expected One or more Scenarios defined
  • 7.
    Structure of aFeature File & Agile Workflow Step 1: User Story / Requirement Elicitation & Elaboration with Customer(s) or Business Owner – Feature file output Step 2: User Story (Feature file) Elaboration & Validation with QA Step 3: Feature & Feature File Implementation by Developers Step 4: Testers Test Functionality Step 5: Acceptance by Business Owner Step 6: Repeat (In Event of Requirement Changes)
  • 8.
    Structure of aFeature File & Agile Workflow Image: http://leankitkanban.com/Content/Images/Features/visualizeTheWorkStuckInQA.png
  • 9.
    Structure of aFeature File & Agile Workflow Step 1: User Story / Requirement Elicitation & Elaboration with Customer(s) and BA Feature File Output: Scenario: Import File Successfully Given no data exists for today When I import the file Then the file data is stored successfully for future retrieval Scenario: View Usage Report Given file import has been completed When I generate a report for today Then a report should be generated And I should see the data from the file in the report fileimport.feature @story(“Report-01&quot;) @Ownership(&quot;BA&quot;) @wip Feature: Import Daily Data File As a Batch Data User I want to import usage data files So that usage data is available in reports
  • 10.
    Structure of aFeature File & Agile Workflow Step 2: Elaboration & Validation with BA & QA Engineer Feature File Output: Scenario: Data Already Exists Given data exists for the imported file date When I import the file Then previously imported data is deleted And the file data is stored successfully for future retrieval … more scenarios … Scenario: View Usage Report Given file import has been completed When I generate a report selecting a specific date Then a report should be generated And I should see data for the date specified fileimport.feature … feature… Scenario: Import File Successfully Given no data exists for the imported file date When I import the file Then the file data is stored successfully for future retrieval
  • 11.
    Structure of aFeature File & Agile Workflow Step 3: Developers Implement Functionality & Scenario Acceptance Criteria FileImport.rb … Other Implementation details … Then /^I should see data for the date specified $/ do date = filefeed.date text = “Units Purchased = 15, Total Cost = $500.00” xpath=&quot;/descendant::header[@class='page'][#{page_number}]/h1&quot; Then &quot;I should see \&quot;#{text}\&quot; within path \&quot;#{xpath}\&quot;&quot; end Then /^(?:|I )should see \/([^\/]*)\/(?: within path &quot;([^&quot;]*)&quot;)?$/ do |regexpression, xpath| regexp = Regexp.new(regexpression, {}, 'U') if page.respond_to? :should # Using Capybara Web Driver page.should have_xpath(xpath, :text => regexp) else assert page.has_xpath?(xpath, :text => regexp) end end
  • 12.
    Structure of aFeature File & Agile Workflow Step 4: Testers Test Functionality Exploratory Testing and / or Define own Cucumber Tests: Scenario: Import File Successfully Given the following data exists | Date | Units | Cost | | 24-03-2010 | 0 | 0 | | 25-03-2010 | 12 | 500.00 | When I import the file containing data | Date | Units | Cost | | 24-03-2010 | 6 | 200.00 | Then the following data is stored for future retrieval | Date | Units | Cost | | 24-03-2010 | 6 | 200.00 | | 25-03-2010 | 12 | 500.00 | fileimport.feature @story(“Report-01&quot;) @Ownership(“QA&quot;) @wip Feature: Import Daily Data File As a Batch Data User I want to import usage data files So that usage data is available in reports
  • 13.
    Structure of aFeature File & Agile Workflow Step 4: Testers Continued Scenario: View Usage Report Given file import has been completed When I generate a report for <date> Then a report should be generated And I should see <data> displayed Examples: | date | data | | 24-03-2010 | Units Purchased = 15, Total Cost = $500.00 | | 25-03-2010 | Units Purchased = 6, Total Cost = $200.00 |
  • 14.
    Structure of aFeature File & Agile Workflow Step 5: Acceptance by Business Owner Confidence that Acceptance Criteria has been implemented via Scenario implementation, Automated Tests by Testers & Integrated with Build System Demo & Acceptance (Business Signoff) of Functionality Showcases
  • 15.
    Structure of aFeature File & Agile Workflow Step 6: Repeat (In Event of Requirement Changes) Feature Files are Modified “Breaks the Build” Developers Implement new functionality to make tests “Pass” Testers test new functionality Business Owner Accepts Functionality Image: http://shirtoid.com/wp-content/uploads/2010/08/Bleh-Broccoli.jpg
  • 16.
    Benefits Requirements areeasy to understand for both Business Stakeholders and Technical Project Members Quality is “Built-in”, assessing requirements quality at the beginning of the process (Elicitation, Elaboration, Validation & Acceptance) Allows easy adaptation to requirements changes Testers can leverage and extend developers work Traceability is relatively easy Image: http://www.onlineweblibrary.com/news/cucumber.jpg
  • 17.
    Potential Pitfalls BDDis a Mindset, Not a Set of Tools Tools are immature Requirements / Functionality Influenced by Consensus Not suitable for all project types Is Not a Replacement for Unit Testing Need to be Mindful of Stakeholders When Wording Features & Scenarios Make Sure Features are Broken Down into Sufficiently small “chunks” Image: http://1.bp.blogspot.com/_8M4A38LyBBs/SI4DVmgay5I/AAAAAAAAAdk/cqJ7Gx4-Bf8/s400/5.jpg
  • 18.
    Further Reading TheRSpec Book: Behaviour Driven Development with Rspec, Cucumber, and Friends http://www.amazon.com/RSpec-Book-Behaviour-Development-Cucumber/dp/1934356379 Cucumber Website - http://cukes.info/ Cuke4Duke (Cucumber for Java) - https://github.com/aslakhellesoy/cuke4duke/wiki JBehave Website - http://jbehave.org/ Webrat (Web Driver) - https://github.com/brynary/webrat/wiki Capybara (Web Driver that extends Webrat) http://rubydoc.info/github/jnicklas/capybara/master/file/README.rdoc http://www.allenwei.cn/cucumber-capybara-what-we-need-for-rails-integration-test/ HTMLUnit – Browser Simulation for Java: http://htmlunit.sourceforge.net/ Culerity (Cucumber wrapper for HTMLUnit) - https://github.com/langalex/culerity/wiki
  • 19.