Intro To 
Behavior Driven Development 
B.D.D.
WHO AM I? 
• Luis Majano - Computer Engineer 
• Born in El Salvador ------------------> 
• Architecture + Software Design 
• CEO of Ortus Solutions 
• Adobe Community Professional 
• Creator of all things Box: 
ColdBox, ContentBox, WireBox....
AGENDA 
• Testing Landscape 
• Why Test 
• TDD Intro 
• BDD Intro 
• TestBox BDD
Why Where to start? 
What to test? 
What not to test? 
Testing 
Landscape
BUGS COST MONEY 
Cost To Fix Time detected 
Requirements Design Building Testing Post-Release 
Time 
Introduced 
Requirements 1x 3x 5-10x 10x 10-100x 
Design --- 1x 10x 15x 25-100x 
Building -- -- 1x 10x 10-25x 
^ Kaner, Cem; James Bach, Bret Pettichord (2001). Lessons Learned in Software Testing: A Context-Driven Approach. Wiley. p. 4. ISBN 0-471-08112-4.
BIGGEST LIE IN SOFTWARE DEV 
Don’t worry, we will 
create the tests and 
refactor it later!
What is T.D.D 
Test-driven development (TDD) is a software 
development process that relies on the repetition of a 
very short development cycle: first the developer 
writes an (initially failing) automated test case that 
defines a desired improvement or new function, 
then produces the minimum amount of code to pass 
that test, and finally refactors the new code to 
acceptable standards
T.D.D. Process 
Write Test 
Mock 
Refactor 
Verify Write Code
T.D.D. 
Validate() 
testValidate()% 
Save() Test% 
CFC 
Add() 
List() 
CFC% 
testAdd()% 
testList()% 
testSave()%
T.D.D. 
• It is an approach to develop software by writing code that exercises your code 
• It does help you: 
• Have immediate feedback 
• Create tests before rather than after (yea right!) 
• Express some behavior and ideas 
• Creates some documentation 
• Verifies your source code compiles and executes
T.D.D. 
• Is not about verifying software requirements 
• Does not: 
• Verify user’s or stakeholder expectations 
• Express that requirements are satisfied 
• Very very developer oriented 
• Tedious as we always have to test methods 
and refactoring is a pain 
• Let’s be truthful, TDD can be a pain in the 
buttocks! 
• We start strong, but we finish weak, even if we 
finish 
Developer Test 
Paralysis
What is B.D.D.? 
In software engineering, behavior-driven development 
(BDD) is a software development process based on 
test-driven development (TDD). Behavior-driven 
development combines the general techniques and 
principles of TDD with ideas from domain-driven 
design and object-oriented analysis and design to 
provide software developers and business analysts 
with shared tools and a shared process to 
collaborate on software development, with the aim of 
delivering "software that matters"
B.D.D is T.D.D. Evolved 
• Dan North - http://dannorth.net/introducing-bdd/ 
• Ubiquitous language 
• existing or being everywhere at the same time : constantly 
• Promotes communication & collaboration between 
• Developers + business analysts + stakeholders 
• Focuses on stories or requirements rather than on functions 
• Focuses on what a system should do and not on how it should be implemented 
• Better readability and visibility 
• Verify that software works but also that it meets customer expectations
B.D.D. Process 
Stories 
Scenario 
Specs 
Implement 
Refactor 
Verify Behavior
Questions Answered 
Where%to% 
start?% 
Outside%/ 
>%In% 
What%to% 
test?% 
User% 
Stories% 
What%Not% 
to%test?% 
Anything% 
Else%
Story Framework 
Story Scenario Spec
Stories to Scenarios 
As an application user 
I want to be welcomed with my name at login 
in order to personalize my experience 
Scenario: user login with valid credentials 
Given a user “luis" with password "secret" exists 
When I login as “luis" with "secret" 
Then I should see the message "Welcome back luis!"
Stories to Scenarios
Story to Scenario to 
TestBox 
As an application user 
I want to be welcomed with my name at login 
in order to personalize my experience 
Scenario: user login with valid credentials 
Given a user “luis" with password "secret" exists 
When I login as “luis" with "secret" 
Then I should see the message "Welcome back luis!" 
describe( “User login with valid credentials”, function(){ 
it( “should see a personalized message”, function(){ 
userService.login( “luis”, “secret” ) 
var event = execute(“user.home”) 
expect( event.getValue( “welcome” ) ).toBe( “Welcome back luis!” ) 
}) 
})
TestBox is a next generation testing framework for ColdFusion that is based 
on BDD (Behavior Driven Development) for providing a clean obvious 
syntax for writing tests. It contains not only a testing framework, runner, 
assertions and expectations library but also integrates with MockBox for 
mocking and stubbing. It also supports xUnit style of testing and MXUnit 
compatibilities.
• BDD & xUnit style testing 
• Life-Cycle methods 
• MockBox Integration 
• Asynchronous Testing 
• ANT/Jenkins Integration 
• Custom Reporters & Runners 
• Dynamic Labels & Skipping 
• Debug Output Streams
INSTALLATION + REQUIREMENTS 
• ColdFusion 9.01+, Railo 3.1+ 
• xUnit + MXUnit Compatibility 
• ColdFusion 10+, Railo 4+ 
• xUnit, MXUnit, BDD 
• Place anywhere you like, create a “/testbox” 
mapping 
• Sublime, CF Builder
TESTING STYLES 
xUnit 
TDD 
Unit Focused 
Function Focused 
Asserts 
BDD 
Test Scenarios 
Spec Focused 
Nested Scenarios 
Expectations
MXUNIT COMPATIBLE 
• Compatible with xUnit style by MXUnit 
• Migrate existing tests to TestBox 
• No BDD 
• How do you migrate? 
• If something is not working, report it: bugs@coldbox.org
What you get! API Docs 
Samples 
Core 
Test Browser 
Test Harness 
Test Runner
Test Harness 
Automated test 
results! 
xUnit/BDD Test 
Bundles 
Harness bootstrap 
HTML Runner 
ANT Runner
TEST BUNDLE CFC 
• No matter what style, you start with a test bundle CFC 
• Inherits from testbox.system.BaseSpec or not! 
• URL runner caveat 
• Get’s lots of methods and properties for testing 
• TesBox will then execute all tests within 1 or more bundles
RUNNING YOUR BUNDLES 
• Execute bundle (if using inheritance) via the URL 
• http://mysite/test/bundle.cfc?method=runRemote 
• Using the TestBox Class: testbox.system.TestBox 
• Bundle(s) Runner 
• Directory Runner 
• SOAP Runner 
• HTTP/REST Runner 
• ANT Runner 
• Custom Runners 
• What’s the output? We call this reporters
REPORTERS 
• ANTJunit : A specific variant of JUnit XML that works with the ANT junitreport task 
• Codexwiki : Produces MediaWiki syntax for usage in Codex Wiki 
• Console : Sends report to console 
• Doc : Builds semantic HTML to produce nice documentation 
• Dot : Builds an awesome dot report 
• JSON : Builds a report into JSON 
• JUnit : Builds a JUnit compliant report 
• Raw : Returns the raw structure representation of the testing results 
• Simple : A basic HTML reporter 
• Text : Back to the 80's with an awesome text report 
• XML : Builds yet another XML testing report 
• Tap : A test anything protocol reporter 
• Min : A minimalistic view of your test reports
TEST BUNDLE CFC 
• run() 
• Declare your scenario specs + suites 
• Life-cycle methods 
• beforeAll(), afterAll() 
• Inherit some assertion, utility and 
mocking methods 
• Expectations Library: expect() 
• Assertions Library: $assert
SUITES: DESCRIBE() YOUR TESTS 
• Suites begin with a describe() block 
• title 
• closure 
• A suite is composed of specs or more suites 
• Closures can contain 
• Life-cycle methods 
• More suites 
• Specs
DESCRIBE() ARGUMENTS 
Annotation Description 
Title The title of the suite to register 
Body The closure that represents the test suite 
Labels The list or array of labels this suite group belongs to 
Skip A flag or a closure that tells TestBox to skip this suite group from testing 
if true. If this is a closure it must return boolean. 
AsyncAll If you want to parallelize the execution of the defined specs in this suite 
group.
SPECS: IT() 
• At least 2 args 
• Title 
• Closure 
• Labels 
• Skip 
• Closure is where you define 
• Scenarios 
• 1+ expectations, assertions 
• Specs tested in order declared
EXPECTATIONS + MATCHERS 
• Self-concatenated method calls that evaluate your SUT 
• Start with a call to expect( actual ) 
• Concatenated with matcher methods 
• TestBox ships with a plethora of matchers! 
• Matchers also have negation (not) counterparts
NESTED SUITES 
• Nest to your heart’s delight 
• Life-cycle methods bubble up 
• Great for grouping and recursive scenarios 
• Execute in descending order
EXPECTING EXCEPTIONS 
• Verifies exceptions 
• Pass a closure to expect() and use toThrow( type, regex ) 
• Match types and message+detail regex
LABELS + SKIPPING 
• Apply labels to suites and specs 
• Skip suites and specs 
• Shortcut methods: xDescribe(), xIt()
ASYNCHRONICITY 
• TestBox executes all specs in parallel 
• Decided on a per describe() block 
• Attention to var-scoping 
• Test shared access and contention 
• Much power comes much responsibility!
What the future holds! 
• Grunt JS Tasks 
• NodeJS Runners and Watchers 
• Sublime Runner 
• More Reporters 
• More focus on automation 
• Gherkins support
Q & A 
Thanks!

CBDW2014 - Behavior Driven Development with TestBox

  • 1.
    Intro To BehaviorDriven Development B.D.D.
  • 2.
    WHO AM I? • Luis Majano - Computer Engineer • Born in El Salvador ------------------> • Architecture + Software Design • CEO of Ortus Solutions • Adobe Community Professional • Creator of all things Box: ColdBox, ContentBox, WireBox....
  • 3.
    AGENDA • TestingLandscape • Why Test • TDD Intro • BDD Intro • TestBox BDD
  • 4.
    Why Where tostart? What to test? What not to test? Testing Landscape
  • 5.
    BUGS COST MONEY Cost To Fix Time detected Requirements Design Building Testing Post-Release Time Introduced Requirements 1x 3x 5-10x 10x 10-100x Design --- 1x 10x 15x 25-100x Building -- -- 1x 10x 10-25x ^ Kaner, Cem; James Bach, Bret Pettichord (2001). Lessons Learned in Software Testing: A Context-Driven Approach. Wiley. p. 4. ISBN 0-471-08112-4.
  • 6.
    BIGGEST LIE INSOFTWARE DEV Don’t worry, we will create the tests and refactor it later!
  • 7.
    What is T.D.D Test-driven development (TDD) is a software development process that relies on the repetition of a very short development cycle: first the developer writes an (initially failing) automated test case that defines a desired improvement or new function, then produces the minimum amount of code to pass that test, and finally refactors the new code to acceptable standards
  • 8.
    T.D.D. Process WriteTest Mock Refactor Verify Write Code
  • 9.
    T.D.D. Validate() testValidate()% Save() Test% CFC Add() List() CFC% testAdd()% testList()% testSave()%
  • 10.
    T.D.D. • Itis an approach to develop software by writing code that exercises your code • It does help you: • Have immediate feedback • Create tests before rather than after (yea right!) • Express some behavior and ideas • Creates some documentation • Verifies your source code compiles and executes
  • 11.
    T.D.D. • Isnot about verifying software requirements • Does not: • Verify user’s or stakeholder expectations • Express that requirements are satisfied • Very very developer oriented • Tedious as we always have to test methods and refactoring is a pain • Let’s be truthful, TDD can be a pain in the buttocks! • We start strong, but we finish weak, even if we finish Developer Test Paralysis
  • 12.
    What is B.D.D.? In software engineering, behavior-driven development (BDD) is a software development process based on test-driven development (TDD). Behavior-driven development combines the general techniques and principles of TDD with ideas from domain-driven design and object-oriented analysis and design to provide software developers and business analysts with shared tools and a shared process to collaborate on software development, with the aim of delivering "software that matters"
  • 13.
    B.D.D is T.D.D.Evolved • Dan North - http://dannorth.net/introducing-bdd/ • Ubiquitous language • existing or being everywhere at the same time : constantly • Promotes communication & collaboration between • Developers + business analysts + stakeholders • Focuses on stories or requirements rather than on functions • Focuses on what a system should do and not on how it should be implemented • Better readability and visibility • Verify that software works but also that it meets customer expectations
  • 14.
    B.D.D. Process Stories Scenario Specs Implement Refactor Verify Behavior
  • 15.
    Questions Answered Where%to% start?% Outside%/ >%In% What%to% test?% User% Stories% What%Not% to%test?% Anything% Else%
  • 16.
    Story Framework StoryScenario Spec
  • 17.
    Stories to Scenarios As an application user I want to be welcomed with my name at login in order to personalize my experience Scenario: user login with valid credentials Given a user “luis" with password "secret" exists When I login as “luis" with "secret" Then I should see the message "Welcome back luis!"
  • 18.
  • 19.
    Story to Scenarioto TestBox As an application user I want to be welcomed with my name at login in order to personalize my experience Scenario: user login with valid credentials Given a user “luis" with password "secret" exists When I login as “luis" with "secret" Then I should see the message "Welcome back luis!" describe( “User login with valid credentials”, function(){ it( “should see a personalized message”, function(){ userService.login( “luis”, “secret” ) var event = execute(“user.home”) expect( event.getValue( “welcome” ) ).toBe( “Welcome back luis!” ) }) })
  • 20.
    TestBox is anext generation testing framework for ColdFusion that is based on BDD (Behavior Driven Development) for providing a clean obvious syntax for writing tests. It contains not only a testing framework, runner, assertions and expectations library but also integrates with MockBox for mocking and stubbing. It also supports xUnit style of testing and MXUnit compatibilities.
  • 21.
    • BDD &xUnit style testing • Life-Cycle methods • MockBox Integration • Asynchronous Testing • ANT/Jenkins Integration • Custom Reporters & Runners • Dynamic Labels & Skipping • Debug Output Streams
  • 22.
    INSTALLATION + REQUIREMENTS • ColdFusion 9.01+, Railo 3.1+ • xUnit + MXUnit Compatibility • ColdFusion 10+, Railo 4+ • xUnit, MXUnit, BDD • Place anywhere you like, create a “/testbox” mapping • Sublime, CF Builder
  • 23.
    TESTING STYLES xUnit TDD Unit Focused Function Focused Asserts BDD Test Scenarios Spec Focused Nested Scenarios Expectations
  • 24.
    MXUNIT COMPATIBLE •Compatible with xUnit style by MXUnit • Migrate existing tests to TestBox • No BDD • How do you migrate? • If something is not working, report it: bugs@coldbox.org
  • 25.
    What you get!API Docs Samples Core Test Browser Test Harness Test Runner
  • 26.
    Test Harness Automatedtest results! xUnit/BDD Test Bundles Harness bootstrap HTML Runner ANT Runner
  • 27.
    TEST BUNDLE CFC • No matter what style, you start with a test bundle CFC • Inherits from testbox.system.BaseSpec or not! • URL runner caveat • Get’s lots of methods and properties for testing • TesBox will then execute all tests within 1 or more bundles
  • 28.
    RUNNING YOUR BUNDLES • Execute bundle (if using inheritance) via the URL • http://mysite/test/bundle.cfc?method=runRemote • Using the TestBox Class: testbox.system.TestBox • Bundle(s) Runner • Directory Runner • SOAP Runner • HTTP/REST Runner • ANT Runner • Custom Runners • What’s the output? We call this reporters
  • 29.
    REPORTERS • ANTJunit: A specific variant of JUnit XML that works with the ANT junitreport task • Codexwiki : Produces MediaWiki syntax for usage in Codex Wiki • Console : Sends report to console • Doc : Builds semantic HTML to produce nice documentation • Dot : Builds an awesome dot report • JSON : Builds a report into JSON • JUnit : Builds a JUnit compliant report • Raw : Returns the raw structure representation of the testing results • Simple : A basic HTML reporter • Text : Back to the 80's with an awesome text report • XML : Builds yet another XML testing report • Tap : A test anything protocol reporter • Min : A minimalistic view of your test reports
  • 30.
    TEST BUNDLE CFC • run() • Declare your scenario specs + suites • Life-cycle methods • beforeAll(), afterAll() • Inherit some assertion, utility and mocking methods • Expectations Library: expect() • Assertions Library: $assert
  • 31.
    SUITES: DESCRIBE() YOURTESTS • Suites begin with a describe() block • title • closure • A suite is composed of specs or more suites • Closures can contain • Life-cycle methods • More suites • Specs
  • 32.
    DESCRIBE() ARGUMENTS AnnotationDescription Title The title of the suite to register Body The closure that represents the test suite Labels The list or array of labels this suite group belongs to Skip A flag or a closure that tells TestBox to skip this suite group from testing if true. If this is a closure it must return boolean. AsyncAll If you want to parallelize the execution of the defined specs in this suite group.
  • 33.
    SPECS: IT() •At least 2 args • Title • Closure • Labels • Skip • Closure is where you define • Scenarios • 1+ expectations, assertions • Specs tested in order declared
  • 34.
    EXPECTATIONS + MATCHERS • Self-concatenated method calls that evaluate your SUT • Start with a call to expect( actual ) • Concatenated with matcher methods • TestBox ships with a plethora of matchers! • Matchers also have negation (not) counterparts
  • 35.
    NESTED SUITES •Nest to your heart’s delight • Life-cycle methods bubble up • Great for grouping and recursive scenarios • Execute in descending order
  • 36.
    EXPECTING EXCEPTIONS •Verifies exceptions • Pass a closure to expect() and use toThrow( type, regex ) • Match types and message+detail regex
  • 37.
    LABELS + SKIPPING • Apply labels to suites and specs • Skip suites and specs • Shortcut methods: xDescribe(), xIt()
  • 38.
    ASYNCHRONICITY • TestBoxexecutes all specs in parallel • Decided on a per describe() block • Attention to var-scoping • Test shared access and contention • Much power comes much responsibility!
  • 39.
    What the futureholds! • Grunt JS Tasks • NodeJS Runners and Watchers • Sublime Runner • More Reporters • More focus on automation • Gherkins support
  • 40.
    Q & A Thanks!