SlideShare una empresa de Scribd logo
1 de 38
Acceptance Test Driven Development Bringing Testers and Developers Together John Ferguson Smart Wakaleo Consulting Ltd. http://www.wakaleo.com Email: john.smart@wakaleo.com Twitter: wakaleo
Introduction ,[object Object],[object Object],[object Object],[object Object]
Acceptance Tests ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Acceptance Tests ,[object Object],[object Object],[object Object]
Acceptance Tests ,[object Object],So how do we know when this feature is done? Let’s write some Acceptance Criteria User Story 1 - Calculate my tax rate As a tax payer, I want to be able to calculate my tax online, so that I can put enough money aside. User Story 1 - Calculate my tax rate As a tax payer, I want to be able to calculate my tax online, so that I can put enough money aside. User Story 1 - Transfer funds As a bank client, I want to transfer funds from my current account to my savings account, so that I can earn more interest User Story 1 - Acceptance Tests - Client can transfer money between two accounts - Client can’t transfer negative amount - Client can’t transfer more than current account balance - Client can’t transfer from a blocked account
Acceptance Tests ,[object Object],[object Object],[object Object],[object Object],[object Object],User Story 1 - Acceptance Tests - Client can transfer money between two accounts - Client can’t transfer negative amount - Client can’t transfer more than current account balance - Client can’t transfer from a blocked account
Acceptance Test-Driven Development ,[object Object],Iteration n-1 Iteration n Iteration n+1 ,[object Object],[object Object],[object Object],[object Object]
Acceptance Test-Driven Development ,[object Object],[object Object],[object Object],[object Object]
Tools for the job ,[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Introducing easyb BDD Acceptance Testing
[object Object],[object Object],[object Object],Easyb in Action
[object Object],[object Object],[object Object],[object Object],Easyb Specifications
Easyb Specifications ,[object Object],Start off with our acceptance criteria description  "A client should be able to transfer money between accounts" it  "should let a client transfer money from a current to a savings a/c" it  "should not allow a client to transfer a negative amount" it  "should not allow a client to transfer more than the current balance" it  "should not allow a client to transfer from a blocked account" Express these in Easyb AccountTransfer.specifications User Story 1 - Acceptance Tests - Client can transfer money between two accounts - Client can’t transfer negative amount - Client can’t transfer more than current account balance - Client can’t transfer from a blocked account
Easyb Specifications ,[object Object],[object Object],description  "A client should be able to transfer money between accounts" it  "should let a client transfer money from a current to a savings a/c" it  "should not allow a client to transfer a negative amount" it  "should not allow a client to transfer more than the current balance" it  "should not allow a client to transfer from a blocked account" This code will run! The tests are marked as ‘PENDING’
Easyb Specifications ,[object Object],[object Object]
Easyb Specifications ,[object Object],[object Object],package  com.wakaleo.accounts.domain description  "A client should be able to transfer money between accounts" it  "should let a client transfer money from a current to a savings a/c" , { current =  new  Account(200) savings =  new  Account(300) current.transferTo(savings, 50) savings.balance.shouldBe 350 current.balance.shouldBe 150  } it  "should not allow a client to transfer a negative amount" it  "should not allow a client to transfer more than the current balance" it  "should not allow a client to transfer from a blocked account" A developer implements the test in Groovy No longer pending Still pending...
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Easyb Stories
Easyb Stories ,[object Object],[object Object],[object Object],scenario  "A client can transfer money from a current to a savings a/c" scenario  "A client is not allowed to transfer a negative amount" scenario  "A client is not allowed to transfer more than the current balance" scenario  "A client is not allowed to transfer from a blocked account" AccountTransfer.story User Story 1 - Acceptance Tests - Client can transfer money between two accounts - Client can’t transfer negative amount - Client can’t transfer more than current account balance - Client can’t transfer from a blocked account
Easyb Stories ,[object Object],[object Object],[object Object],[object Object],[object Object],scenario  "A client can transfer money from a current to a savings a/c" , { given  'a current a/c with $200 and a savings a/c with $300' when  'you transfer $50 from the current a/c to the savings a/c' then  'the savings a/c should have $350 and the current a/c $150' }
[object Object],Easyb Stories package  com.wakaleo.accounts.domain scenario   "A client can transfer money from a current to a savings a/c" , { given   'a current a/c with $200 and a savings a/c with $300' , { current =  new  Account(200) savings =  new  Account(300) } when   'you transfer $50 from the current a/c to the savings a/c' , { current . transferTo ( savings , 50) } then   'the savings a/c should have $350 and the current a/c $150' , { savings . balance . shouldBe  350 current . balance . shouldBe  150  } } scenario   "A client is not allowed to transfer a negative amount" scenario   "A client is not allowed to transfer more than the current balance" scenario   "A client is not allowed to transfer from a blocked account"
[object Object],Easyb Stories package  com.wakaleo.accounts.domain scenario   "A client can transfer money from a current to a savings a/c" , { given   'a current a/c with $200' , { current =  new  Account(200) }  and   'a savings a/c with $300' , { savings =  new  Account(300) }  when   'you transfer $50 from the current a/c to the savings a/c' , { current . transferTo ( savings , 50) } then   'the savings a/c should have $350 and the current a/c $150' , { savings . balance . shouldBe  350 }  and   'the current a/c should have $150' , { current . balance . shouldBe  150  } } scenario   "A client is not allowed to transfer a negative amount" scenario   "A client is not allowed to transfer more than the current balance" scenario   "A client is not allowed to transfer from a blocked account" Using ‘and’ for more clarity
[object Object],[object Object],[object Object],[object Object],Easyb assertions account.balance.shouldBe initialAmount account.balance.shouldBeEqualTo initialAmount account.balance.shouldNotBe 0 account.balance.shouldBeGreaterThan 0 account.shouldHave(balance:initialAmount)
[object Object],Easyb Stories package  com.wakaleo.accounts.domain scenario  "A client can transfer money from a current to a savings a/c" , { ... } scenario  "A client is not allowed to transfer a negative amount" , { given  'a current a/c with $200' , { current =  new  Account(200) }  and  'a savings a/c with $300' , { savings =  new  Account(300) }  when  "you try to transfer a negative amount" , { transferNegativeAmount = { current.transferTo(savings, -50) } } then  "an IllegalTransferException should be thrown" , { ensureThrows(IllegalTransferException. class ) { transferNegativeAmount() } } } scenario  "A client is not allowed to transfer more than the current balance" scenario  "A client is not allowed to transfer from a blocked account" Create a closure representing this operation Fail if the exception is not thrown
Easyb fixtures ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
[object Object],Easyb fixtures before_each   "setup the test accounts" , { given   'a current a/c with $200' , { current =  new  Account(200) }  and   'a savings a/c with $300' , { savings =  new  Account(300) }  } scenario   "A client can transfer money from a current to a savings a/c" , { when   'you transfer $50 from the current a/c to the savings a/c' , { current . transferTo ( savings , 50) } then   'the savings a/c should have $350 and the current a/c $150' , { savings . balance . shouldBe  350 }  and   'the current a/c should have $150' , { current . balance . shouldBe  150  } } scenario   "A client is not allowed to transfer a negative amount" , { when   "you try to transfer a negative amount" , { transferNegativeAmount = { current . transferTo ( savings , -50) } } then   "an IllegalTransferException should be thrown" , { ensureThrows (IllegalTransferException. class ) { transferNegativeAmount () } } } This will be done before each scenario
Easyb fixtures ,[object Object],[object Object],shared_behavior  "shared behaviors" ,   {    given  "a string" ,   {      var   =   ""    }    when   "the string is hello world" ,   {      var   =   "hello world"    } } scenario  "first scenario" ,   {    it_behaves_as  "shared behaviors"       then   "the string should start with hello" ,   {      var . shouldStartWith  "hello"    } } scenario  "second scenario" ,   {    it_behaves_as  "shared behaviors"       then   "the string should end with world" ,   {      var . shouldEndWith  "world"    } } Common behavior (‘shared_behavior’) Reused here (‘it_behaves_as’)... ...and here
Web testing with easyb ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Web testing with easyb ,[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object]
Web testing with easyb ,[object Object],import  net.sourceforge.jwebunit.junit.WebTester before_each   "initialize a web test client" , { given   "we have a web test client" , { tester =  new  WebTester() tester.setBaseUrl( "http://localhost:8080/tweeter-web" ) } } scenario   "User signup should add a new user" , { when   "I click on the sign up button on the home page" , { tester.beginAt( "/home" ) tester.clickLinkWithText( "Sign up now!" ) } and   "I enter a new username and password" , { tester.setTextField( "username" ,  "jane" ) tester.setTextField( "password" ,  "tiger" ) tester.submit() } then   "the application should log me on as the new user and show a welcome message" , { tester.assertTextPresent( "Hi jane!" ) } } Set up a JWebUnit client Click on a link Enter some values Check the results
[object Object],Easyb reports Test results summary Failed stories Unimplemented stories
[object Object],Easyb reports Test results summary Test failure details Unimplemented stories
[object Object],[object Object],[object Object],[object Object],Other Approaches
[object Object],[object Object],[object Object],FitNesse
[object Object],FitNesse Test data and scenarios as a table Test data Expected results
[object Object],FitNesse Testers can write/edit the Wiki pages You can also import to and from Excel
[object Object],FitNesse public   class  TransferMoneyBetweenAccounts { private  BigDecimal  savingsBalance ; private  BigDecimal  currentBalance ; private  BigDecimal  transfer ; private  BigDecimal  finalSavingsBalance ; private  BigDecimal  finalCurrentBalance ; private   boolean   exceptionThrown ; public   void  setSavingsBalance(BigDecimal savingsBalance) {...} public   void  setCurrentBalance(BigDecimal currentBalance) {...} public   void  setTransfer(BigDecimal transfer) {...} public  BigDecimal finalCurrentBalance() {...}  public  BigDecimal finalSavingsBalance() {...} public   boolean  exceptionThrown() {...} public   void  execute() { Account currentAccount =  new  Account( currentBalance ); Account savingsAccount =  new  Account( savingsBalance ); exceptionThrown  =  false ; try  { currentAccount.transferTo(savingsAccount,  transfer ); finalCurrentBalance  = currentAccount.getBalance(); finalSavingsBalance  = savingsAccount.getBalance(); }  catch  (IllegalTransferException e) { exceptionThrown  =  true ; } } } Tests are implemented by Java classes Each column has a field in the class Expected results have getters Performing the test
[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],[object Object],Commercial options?
Thank You John Ferguson Smart Wakaleo Consulting Ltd. http://www.wakaleo.com Email: john.smart@wakaleo.com Twitter: wakaleo

Más contenido relacionado

Similar a Acceptance Test Driven Development

Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...John Ferguson Smart Limited
 
Growing software from examples
Growing software from examplesGrowing software from examples
Growing software from examplesSeb Rose
 
Invoicing Gem - Sales & Payments In Your App
Invoicing Gem - Sales & Payments In Your AppInvoicing Gem - Sales & Payments In Your App
Invoicing Gem - Sales & Payments In Your AppMartin Kleppmann
 
Agile Acceptance Criteria How To
Agile Acceptance Criteria How ToAgile Acceptance Criteria How To
Agile Acceptance Criteria How ToPayton Consulting
 
INVEST in good user stories
INVEST in good user storiesINVEST in good user stories
INVEST in good user storiesSushant Tarway
 
Finance-Presentation-CRP1.pdf
Finance-Presentation-CRP1.pdfFinance-Presentation-CRP1.pdf
Finance-Presentation-CRP1.pdfPrasoonMohanty1
 
Building a powerful double entry accounting system
Building a powerful double entry accounting systemBuilding a powerful double entry accounting system
Building a powerful double entry accounting systemLucas Cavalcanti dos Santos
 
2 ivan pashko - fake it 'til you make it
2   ivan pashko - fake it 'til you make it2   ivan pashko - fake it 'til you make it
2 ivan pashko - fake it 'til you make itIevgenii Katsan
 
Cash Receipts in SAP ERP
Cash Receipts in SAP ERPCash Receipts in SAP ERP
Cash Receipts in SAP ERPBill Hanna, CPA
 
Zen and the Art of Automated Acceptance Test Suite Maintenance
Zen and the Art of Automated Acceptance Test Suite MaintenanceZen and the Art of Automated Acceptance Test Suite Maintenance
Zen and the Art of Automated Acceptance Test Suite MaintenanceJohn Ferguson Smart Limited
 
Order to Cash Overview - Training
Order to Cash Overview - TrainingOrder to Cash Overview - Training
Order to Cash Overview - TrainingKoushik Bagchi
 
Fake it til you make it. Ivan Pashko
Fake it til you make it. Ivan PashkoFake it til you make it. Ivan Pashko
Fake it til you make it. Ivan PashkoIevgenii Katsan
 
Accounting and M.O.M.7i
Accounting and M.O.M.7iAccounting and M.O.M.7i
Accounting and M.O.M.7iMolly
 
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...John Ferguson Smart Limited
 
How to Write Great User Stories Today.pptx
How to Write Great User Stories Today.pptxHow to Write Great User Stories Today.pptx
How to Write Great User Stories Today.pptxAlanJamisonMBASPC
 

Similar a Acceptance Test Driven Development (20)

Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
 
Growing software from examples
Growing software from examplesGrowing software from examples
Growing software from examples
 
Invoicing Gem - Sales & Payments In Your App
Invoicing Gem - Sales & Payments In Your AppInvoicing Gem - Sales & Payments In Your App
Invoicing Gem - Sales & Payments In Your App
 
My Portfolio
My PortfolioMy Portfolio
My Portfolio
 
Agile Acceptance Criteria How To
Agile Acceptance Criteria How ToAgile Acceptance Criteria How To
Agile Acceptance Criteria How To
 
Fusion recivables
Fusion recivablesFusion recivables
Fusion recivables
 
Defining tasks for User Stories
Defining tasks for User StoriesDefining tasks for User Stories
Defining tasks for User Stories
 
INVEST in good user stories
INVEST in good user storiesINVEST in good user stories
INVEST in good user stories
 
Finance-Presentation-CRP1.pdf
Finance-Presentation-CRP1.pdfFinance-Presentation-CRP1.pdf
Finance-Presentation-CRP1.pdf
 
Effective User Stories.pdf
Effective User Stories.pdfEffective User Stories.pdf
Effective User Stories.pdf
 
Building a powerful double entry accounting system
Building a powerful double entry accounting systemBuilding a powerful double entry accounting system
Building a powerful double entry accounting system
 
2 ivan pashko - fake it 'til you make it
2   ivan pashko - fake it 'til you make it2   ivan pashko - fake it 'til you make it
2 ivan pashko - fake it 'til you make it
 
Cash Receipts in SAP ERP
Cash Receipts in SAP ERPCash Receipts in SAP ERP
Cash Receipts in SAP ERP
 
Zen and the Art of Automated Acceptance Test Suite Maintenance
Zen and the Art of Automated Acceptance Test Suite MaintenanceZen and the Art of Automated Acceptance Test Suite Maintenance
Zen and the Art of Automated Acceptance Test Suite Maintenance
 
Order to Cash Overview - Training
Order to Cash Overview - TrainingOrder to Cash Overview - Training
Order to Cash Overview - Training
 
Fake it til you make it. Ivan Pashko
Fake it til you make it. Ivan PashkoFake it til you make it. Ivan Pashko
Fake it til you make it. Ivan Pashko
 
Accounting and M.O.M.7i
Accounting and M.O.M.7iAccounting and M.O.M.7i
Accounting and M.O.M.7i
 
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
Beyond Given/When/Then - why diving into Cucumber is the wrong approach to ad...
 
Payment gateway
Payment gatewayPayment gateway
Payment gateway
 
How to Write Great User Stories Today.pptx
How to Write Great User Stories Today.pptxHow to Write Great User Stories Today.pptx
How to Write Great User Stories Today.pptx
 

Más de Skills Matter

5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard LawrenceSkills Matter
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applicationsSkills Matter
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmSkills Matter
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimSkills Matter
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Skills Matter
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlSkills Matter
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsSkills Matter
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Skills Matter
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Skills Matter
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldSkills Matter
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Skills Matter
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Skills Matter
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingSkills Matter
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveSkills Matter
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSkills Matter
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tSkills Matter
 

Más de Skills Matter (20)

5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence5 things cucumber is bad at by Richard Lawrence
5 things cucumber is bad at by Richard Lawrence
 
Patterns for slick database applications
Patterns for slick database applicationsPatterns for slick database applications
Patterns for slick database applications
 
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvmScala e xchange 2013 haoyi li on metascala a tiny diy jvm
Scala e xchange 2013 haoyi li on metascala a tiny diy jvm
 
Oscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheimOscar reiken jr on our success at manheim
Oscar reiken jr on our success at manheim
 
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
Progressive f# tutorials nyc dmitry mozorov & jack pappas on code quotations ...
 
Cukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberlCukeup nyc ian dees on elixir, erlang, and cucumberl
Cukeup nyc ian dees on elixir, erlang, and cucumberl
 
Cukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.jsCukeup nyc peter bell on getting started with cucumber.js
Cukeup nyc peter bell on getting started with cucumber.js
 
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
Agile testing & bdd e xchange nyc 2013 jeffrey davidson & lav pathak & sam ho...
 
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
Progressive f# tutorials nyc rachel reese & phil trelford on try f# from zero...
 
Progressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source worldProgressive f# tutorials nyc don syme on keynote f# in the open source world
Progressive f# tutorials nyc don syme on keynote f# in the open source world
 
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
Agile testing & bdd e xchange nyc 2013 gojko adzic on bond villain guide to s...
 
Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#Dmitry mozorov on code quotations code as-data for f#
Dmitry mozorov on code quotations code as-data for f#
 
A poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testingA poet's guide_to_acceptance_testing
A poet's guide_to_acceptance_testing
 
Russ miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-diveRuss miles-cloudfoundry-deep-dive
Russ miles-cloudfoundry-deep-dive
 
Serendipity-neo4j
Serendipity-neo4jSerendipity-neo4j
Serendipity-neo4j
 
Simon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelismSimon Peyton Jones: Managing parallelism
Simon Peyton Jones: Managing parallelism
 
Plug 20110217
Plug   20110217Plug   20110217
Plug 20110217
 
Lug presentation
Lug presentationLug presentation
Lug presentation
 
I went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_tI went to_a_communications_workshop_and_they_t
I went to_a_communications_workshop_and_they_t
 
Plug saiku
Plug   saikuPlug   saiku
Plug saiku
 

Último

WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brandgvaughan
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenHervé Boutemy
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningLars Bell
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebUiPathCommunity
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .Alan Dix
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):comworks
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr BaganFwdays
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfPrecisely
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Commit University
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsRizwan Syed
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionDilum Bandara
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubKalema Edgar
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyAlfredo García Lavilla
 

Último (20)

WordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your BrandWordPress Websites for Engineers: Elevate Your Brand
WordPress Websites for Engineers: Elevate Your Brand
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
DevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache MavenDevoxxFR 2024 Reproducible Builds with Apache Maven
DevoxxFR 2024 Reproducible Builds with Apache Maven
 
DSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine TuningDSPy a system for AI to Write Prompts and Do Fine Tuning
DSPy a system for AI to Write Prompts and Do Fine Tuning
 
Dev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio WebDev Dives: Streamline document processing with UiPath Studio Web
Dev Dives: Streamline document processing with UiPath Studio Web
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .From Family Reminiscence to Scholarly Archive .
From Family Reminiscence to Scholarly Archive .
 
CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):CloudStudio User manual (basic edition):
CloudStudio User manual (basic edition):
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan"ML in Production",Oleksandr Bagan
"ML in Production",Oleksandr Bagan
 
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdfHyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
Hyperautomation and AI/ML: A Strategy for Digital Transformation Success.pdf
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!Nell’iperspazio con Rocket: il Framework Web di Rust!
Nell’iperspazio con Rocket: il Framework Web di Rust!
 
Scanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL CertsScanning the Internet for External Cloud Exposures via SSL Certs
Scanning the Internet for External Cloud Exposures via SSL Certs
 
Advanced Computer Architecture – An Introduction
Advanced Computer Architecture – An IntroductionAdvanced Computer Architecture – An Introduction
Advanced Computer Architecture – An Introduction
 
Unleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding ClubUnleash Your Potential - Namagunga Girls Coding Club
Unleash Your Potential - Namagunga Girls Coding Club
 
Commit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easyCommit 2024 - Secret Management made easy
Commit 2024 - Secret Management made easy
 

Acceptance Test Driven Development

  • 1. Acceptance Test Driven Development Bringing Testers and Developers Together John Ferguson Smart Wakaleo Consulting Ltd. http://www.wakaleo.com Email: john.smart@wakaleo.com Twitter: wakaleo
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.
  • 27.
  • 28.
  • 29.
  • 30.
  • 31.
  • 32.
  • 33.
  • 34.
  • 35.
  • 36.
  • 37.
  • 38. Thank You John Ferguson Smart Wakaleo Consulting Ltd. http://www.wakaleo.com Email: john.smart@wakaleo.com Twitter: wakaleo