SlideShare a Scribd company logo
1 of 29
Download to read offline
Appetite comes with testing

     “It's a dangerous business, Frodo, going out
     your door. You step onto the road, and if you
     don't keep your feet, there's no knowing
     where you might be swept off to.”
                               J.R.R. Tolkien, The Lord of the Rings




Change begins with awareness
Defect Cost Increase




Change begins with awareness
Defect Cost Increase




Change begins with awareness
Stress cycle




Change begins with awareness
Testing as...




      documentation


Change begins with awareness
Testing as...



        instrument for
          cooperation

Change begins with awareness
Testing as...


        instrument for
         open source
         cooperation

Change begins with awareness
Pair programming




Change begins with awareness
All begins with...




   ...a need
Change begins with awareness
And...




 “Supporting multiple user classes is not easy at all. It would
 make the bundle code far more complex as we would
 basically need to change all places interacting with the user
 to be able to handle all user classes. I don't really want to
 go this way (it will also make it more likely to introduce
 bugs).”

    ...a delusion
Change begins with awareness
But...


  In Symfony2, all core classes use the service container,
  so it is easy to extend, configure and use any object




   ...a hope
Change begins with awareness
Service Container
                  Dependency Injection Container


          use AcmeHelloBundleMailer;

          $mailer = new Mailer('sendmail');
          $mailer->send('info@netmeans.net', ... );




Change begins with awareness
Service Container
                  Dependency Injection Container
          class Mailer
          {
              private $mailerType;

              public function __construct($mailerType)
              {
                  $this->mailerType = $mailerType
              }

              public function send($to, ...)
              {
                  ...
              }
          }

          services:
              my_mailer:
                  class:       AcmeHelloBundleMailer
                  arguments:   [sendmail]


Change begins with awareness
Service Container
                  Dependency Injection Container


          class HelloController extends Controller
          {
              public function sendEmailAction()
              {
                  $mailer = $this->get('my_mailer');
                  $mailer->send('info@netmeans.net', ... );
              }
          }




Change begins with awareness
FOSUserBundle
             fos_user:
                 db_driver: orm
                 firewall_name: main
                 user_class: AcmeUserBundleEntityUser




Change begins with awareness
FOSUserBundle
             fos_user:
                 db_driver: orm
                 firewall_name: main
                 user_class: AcmeUserBundleEntityUser
                 service:
                     user_manager: custom_user_manager




Change begins with awareness
So ...

          We have to create our custom
          UserManager that accepts in the
          constructor an object that have the
          responsibility to discriminate user
          types




...a solution
Change begins with awareness
First of all: test

          We start writing some functional
          tests to check correct integration
          of FOSUserBundle




Change begins with awareness
Now we feel good

          We can extends FOSUser without pain
          improving changes step by step




Change begins with awareness
Custom UserManager

 Class UserManager extends FOSUserBundleEntityUserManager
 {
     protected $userDiscriminator;

     public function __construct(..., UserDiscriminator $userDiscriminator)

     public function getClass()
     {
         return $this->userDiscriminator->getClass();
     }
 }




Change begins with awareness
UserDiscriminator

              public function getClass()
              {
                 return 'Acme/UserBundle/Entity/UserOne';
              }




Change begins with awareness
From here it's all smooth

          With little iterations, we improve
          UserManager and UserDiscriminator
          with unit and functional tests,
          passing from a dirty code to a more
          elegant one




Change begins with awareness
NmnMultiUserBundle
     fos_user:
         db_driver: orm
         firewall_name: main
         user_class: AcmeUserBundleEntityUser
         service:
             user_manager: nmn_user_manager
         registration:
             form:
                 handler: nmn_user_registration_form_handler
         profile:
             form:
                 handler: nmn_user_profile_form_handler




Change begins with awareness
NmnMultiUserBundle
  parameters:
    nmn_user_discriminator_parameters:
      classes:
          user_one:
              entity: AcmeUserBundleEntityUserOne
              registration: AcmeUserBundleFormTypeRegistrationUserOneFormType
              profile: AcmeUserBundleFormTypeProfileUserOneFormType
              factory:
          user_two:
              entity: AcmeUserBundleEntityUserTwo
              registration: AcmeUserBundleFormTypeRegistrationUserTwoFormType
              profile: AcmeUserBundleFormTypeProfileUserTwoFormType
              factory:




Change begins with awareness
NmnMultiUserBundle

     Ok, it is an hack :)

     A lazy way to use for free most of the
     functionality of FOSUserBundle ...

     ... but it is ready to be improved by
     anyone.




Change begins with awareness
NmnMultiUserBundle

        github.com/netmeansnet/NmnMultiUserBundle

        github.com/netmeansnet/NmnMultiUserBundleSandbox

        travis-ci.org/#!/netmeansnet/NmnMultiUserBundle




                               @leonardo_nmn

                               @euxpom




Change begins with awareness
Some Books
                       The Clean Coder
                       A code of Conduct for Professional Programmers




                       Martin, Robert C.




I know this sounds strident and unilateral, but given the record I don't
think the surgeons should have to defend hand-washing, and I don't
think programmers should have to defend TDD

Change begins with awareness
Some Books
                       Extreme Programming Explained
                       Embrace Change




                       Beck, Kent




In software development, “perfect” is a verb, not an adjective
In XP, testing is as important as programming
Change begins with awareness
Some Books
                       The Grumpy Programmer's Guide To Building
                       Testable Applications in PHP




                       Hartjes, Chris




Building testable applications is Hard
The reason for investing in automated testing is obvious: any bugs you
catch before your application makes it into production cost less in terms
of resources (money, developer time) to fix than fixing it into production

Change begins with awareness

More Related Content

Similar to Appetite comes with testing

The Taming Of The Code
The Taming Of The CodeThe Taming Of The Code
The Taming Of The Code
Alan Stevens
 

Similar to Appetite comes with testing (20)

Cucumber Basics.pdf
Cucumber Basics.pdfCucumber Basics.pdf
Cucumber Basics.pdf
 
Building Large Scale Javascript Application
Building Large Scale Javascript ApplicationBuilding Large Scale Javascript Application
Building Large Scale Javascript Application
 
Dependency injection in Drupal 8 : DrupalCon NOLA
Dependency injection in Drupal 8 : DrupalCon NOLADependency injection in Drupal 8 : DrupalCon NOLA
Dependency injection in Drupal 8 : DrupalCon NOLA
 
The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)The quest for global design principles (SymfonyLive Berlin 2015)
The quest for global design principles (SymfonyLive Berlin 2015)
 
The quest for global design principles - PHP Benelux 2016
The quest for global design principles - PHP Benelux 2016The quest for global design principles - PHP Benelux 2016
The quest for global design principles - PHP Benelux 2016
 
Working Effectively With Legacy Code
Working Effectively With Legacy CodeWorking Effectively With Legacy Code
Working Effectively With Legacy Code
 
Sending Email with Rails
Sending Email with RailsSending Email with Rails
Sending Email with Rails
 
A dive into Symfony 4
A dive into Symfony 4A dive into Symfony 4
A dive into Symfony 4
 
The Taming Of The Code
The Taming Of The CodeThe Taming Of The Code
The Taming Of The Code
 
Clean code
Clean codeClean code
Clean code
 
Lesson10 behavioral patterns
Lesson10 behavioral patternsLesson10 behavioral patterns
Lesson10 behavioral patterns
 
JUNit Presentation
JUNit PresentationJUNit Presentation
JUNit Presentation
 
Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2 Osiąganie mądrej architektury z Symfony2
Osiąganie mądrej architektury z Symfony2
 
Environment Variables in Angular
Environment Variables in AngularEnvironment Variables in Angular
Environment Variables in Angular
 
A Series of Fortunate Events - PHP Benelux Conference 2015
A Series of Fortunate Events - PHP Benelux Conference 2015A Series of Fortunate Events - PHP Benelux Conference 2015
A Series of Fortunate Events - PHP Benelux Conference 2015
 
Cosmos SDK Workshop: How to Build a Blockchain from Scratch
Cosmos SDK Workshop: How to Build a Blockchain from ScratchCosmos SDK Workshop: How to Build a Blockchain from Scratch
Cosmos SDK Workshop: How to Build a Blockchain from Scratch
 
Command pattern in java
Command pattern in javaCommand pattern in java
Command pattern in java
 
Behavioral pattern 4
Behavioral pattern 4Behavioral pattern 4
Behavioral pattern 4
 
Resources and relationships at front-end
Resources and relationships at front-endResources and relationships at front-end
Resources and relationships at front-end
 
NSNotificationCenter vs. AppDelegate
NSNotificationCenter vs. AppDelegateNSNotificationCenter vs. AppDelegate
NSNotificationCenter vs. AppDelegate
 

Recently uploaded

Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
panagenda
 
Structuring Teams and Portfolios for Success
Structuring Teams and Portfolios for SuccessStructuring Teams and Portfolios for Success
Structuring Teams and Portfolios for Success
UXDXConf
 

Recently uploaded (20)

How Red Hat Uses FDO in Device Lifecycle _ Costin and Vitaliy at Red Hat.pdf
How Red Hat Uses FDO in Device Lifecycle _ Costin and Vitaliy at Red Hat.pdfHow Red Hat Uses FDO in Device Lifecycle _ Costin and Vitaliy at Red Hat.pdf
How Red Hat Uses FDO in Device Lifecycle _ Costin and Vitaliy at Red Hat.pdf
 
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
Integrating Telephony Systems with Salesforce: Insights and Considerations, B...
 
Overview of Hyperledger Foundation
Overview of Hyperledger FoundationOverview of Hyperledger Foundation
Overview of Hyperledger Foundation
 
AI presentation and introduction - Retrieval Augmented Generation RAG 101
AI presentation and introduction - Retrieval Augmented Generation RAG 101AI presentation and introduction - Retrieval Augmented Generation RAG 101
AI presentation and introduction - Retrieval Augmented Generation RAG 101
 
A Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System StrategyA Business-Centric Approach to Design System Strategy
A Business-Centric Approach to Design System Strategy
 
AI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří KarpíšekAI revolution and Salesforce, Jiří Karpíšek
AI revolution and Salesforce, Jiří Karpíšek
 
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
Measures in SQL (a talk at SF Distributed Systems meetup, 2024-05-22)
 
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
Easier, Faster, and More Powerful – Alles Neu macht der Mai -Wir durchleuchte...
 
Google I/O Extended 2024 Warsaw
Google I/O Extended 2024 WarsawGoogle I/O Extended 2024 Warsaw
Google I/O Extended 2024 Warsaw
 
IESVE for Early Stage Design and Planning
IESVE for Early Stage Design and PlanningIESVE for Early Stage Design and Planning
IESVE for Early Stage Design and Planning
 
Structuring Teams and Portfolios for Success
Structuring Teams and Portfolios for SuccessStructuring Teams and Portfolios for Success
Structuring Teams and Portfolios for Success
 
Microsoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - QuestionnaireMicrosoft CSP Briefing Pre-Engagement - Questionnaire
Microsoft CSP Briefing Pre-Engagement - Questionnaire
 
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptxUnpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
Unpacking Value Delivery - Agile Oxford Meetup - May 2024.pptx
 
PLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. StartupsPLAI - Acceleration Program for Generative A.I. Startups
PLAI - Acceleration Program for Generative A.I. Startups
 
What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024What's New in Teams Calling, Meetings and Devices April 2024
What's New in Teams Calling, Meetings and Devices April 2024
 
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdfSimplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
Simplified FDO Manufacturing Flow with TPMs _ Liam at Infineon.pdf
 
Speed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in MinutesSpeed Wins: From Kafka to APIs in Minutes
Speed Wins: From Kafka to APIs in Minutes
 
Using IESVE for Room Loads Analysis - UK & Ireland
Using IESVE for Room Loads Analysis - UK & IrelandUsing IESVE for Room Loads Analysis - UK & Ireland
Using IESVE for Room Loads Analysis - UK & Ireland
 
Powerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara LaskowskaPowerful Start- the Key to Project Success, Barbara Laskowska
Powerful Start- the Key to Project Success, Barbara Laskowska
 
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
TEST BANK For, Information Technology Project Management 9th Edition Kathy Sc...
 

Appetite comes with testing

  • 1. Appetite comes with testing “It's a dangerous business, Frodo, going out your door. You step onto the road, and if you don't keep your feet, there's no knowing where you might be swept off to.” J.R.R. Tolkien, The Lord of the Rings Change begins with awareness
  • 2. Defect Cost Increase Change begins with awareness
  • 3. Defect Cost Increase Change begins with awareness
  • 4. Stress cycle Change begins with awareness
  • 5. Testing as... documentation Change begins with awareness
  • 6. Testing as... instrument for cooperation Change begins with awareness
  • 7. Testing as... instrument for open source cooperation Change begins with awareness
  • 9. All begins with... ...a need Change begins with awareness
  • 10. And... “Supporting multiple user classes is not easy at all. It would make the bundle code far more complex as we would basically need to change all places interacting with the user to be able to handle all user classes. I don't really want to go this way (it will also make it more likely to introduce bugs).” ...a delusion Change begins with awareness
  • 11. But... In Symfony2, all core classes use the service container, so it is easy to extend, configure and use any object ...a hope Change begins with awareness
  • 12. Service Container Dependency Injection Container use AcmeHelloBundleMailer; $mailer = new Mailer('sendmail'); $mailer->send('info@netmeans.net', ... ); Change begins with awareness
  • 13. Service Container Dependency Injection Container class Mailer { private $mailerType; public function __construct($mailerType) { $this->mailerType = $mailerType } public function send($to, ...) { ... } } services: my_mailer: class: AcmeHelloBundleMailer arguments: [sendmail] Change begins with awareness
  • 14. Service Container Dependency Injection Container class HelloController extends Controller { public function sendEmailAction() { $mailer = $this->get('my_mailer'); $mailer->send('info@netmeans.net', ... ); } } Change begins with awareness
  • 15. FOSUserBundle fos_user: db_driver: orm firewall_name: main user_class: AcmeUserBundleEntityUser Change begins with awareness
  • 16. FOSUserBundle fos_user: db_driver: orm firewall_name: main user_class: AcmeUserBundleEntityUser service: user_manager: custom_user_manager Change begins with awareness
  • 17. So ... We have to create our custom UserManager that accepts in the constructor an object that have the responsibility to discriminate user types ...a solution Change begins with awareness
  • 18. First of all: test We start writing some functional tests to check correct integration of FOSUserBundle Change begins with awareness
  • 19. Now we feel good We can extends FOSUser without pain improving changes step by step Change begins with awareness
  • 20. Custom UserManager Class UserManager extends FOSUserBundleEntityUserManager { protected $userDiscriminator; public function __construct(..., UserDiscriminator $userDiscriminator) public function getClass() { return $this->userDiscriminator->getClass(); } } Change begins with awareness
  • 21. UserDiscriminator public function getClass() { return 'Acme/UserBundle/Entity/UserOne'; } Change begins with awareness
  • 22. From here it's all smooth With little iterations, we improve UserManager and UserDiscriminator with unit and functional tests, passing from a dirty code to a more elegant one Change begins with awareness
  • 23. NmnMultiUserBundle fos_user: db_driver: orm firewall_name: main user_class: AcmeUserBundleEntityUser service: user_manager: nmn_user_manager registration: form: handler: nmn_user_registration_form_handler profile: form: handler: nmn_user_profile_form_handler Change begins with awareness
  • 24. NmnMultiUserBundle parameters: nmn_user_discriminator_parameters: classes: user_one: entity: AcmeUserBundleEntityUserOne registration: AcmeUserBundleFormTypeRegistrationUserOneFormType profile: AcmeUserBundleFormTypeProfileUserOneFormType factory: user_two: entity: AcmeUserBundleEntityUserTwo registration: AcmeUserBundleFormTypeRegistrationUserTwoFormType profile: AcmeUserBundleFormTypeProfileUserTwoFormType factory: Change begins with awareness
  • 25. NmnMultiUserBundle Ok, it is an hack :) A lazy way to use for free most of the functionality of FOSUserBundle ... ... but it is ready to be improved by anyone. Change begins with awareness
  • 26. NmnMultiUserBundle github.com/netmeansnet/NmnMultiUserBundle github.com/netmeansnet/NmnMultiUserBundleSandbox travis-ci.org/#!/netmeansnet/NmnMultiUserBundle @leonardo_nmn @euxpom Change begins with awareness
  • 27. Some Books The Clean Coder A code of Conduct for Professional Programmers Martin, Robert C. I know this sounds strident and unilateral, but given the record I don't think the surgeons should have to defend hand-washing, and I don't think programmers should have to defend TDD Change begins with awareness
  • 28. Some Books Extreme Programming Explained Embrace Change Beck, Kent In software development, “perfect” is a verb, not an adjective In XP, testing is as important as programming Change begins with awareness
  • 29. Some Books The Grumpy Programmer's Guide To Building Testable Applications in PHP Hartjes, Chris Building testable applications is Hard The reason for investing in automated testing is obvious: any bugs you catch before your application makes it into production cost less in terms of resources (money, developer time) to fix than fixing it into production Change begins with awareness