Upgrade to Pro — share decks privately, control downloads, hide ads and more …

TDD with PHP - The secret to coding with confid...

TDD with PHP - The secret to coding with confidence

Presented at the PHP Developer Summit in Philippines (Pasig City, Manila, Philippines).

Michael Cheng

April 20, 2013
Tweet

More Decks by Michael Cheng

Other Decks in Programming

Transcript

  1. What is TDD? • Traditional idea of code testing: •

    Write code first, test if you have time. • Often times, you'll be too exhausted (mentally) at the end of coding process to write tests. Saturday, 20 April, 13
  2. What is TDD? • Getting into the habit of writing

    tests before writing code. • TDD are continuous short cycles of: • Writing Tests (separate files), • Writing Code, • Refactor (remove redundancy, optimize, edge cases). Saturday, 20 April, 13
  3. TDD Process 1 Feature specifications 2 Write test cases 3

    Tests will fail 4 Write code to pass the tests (minimal) 5 Pass all tests 6 Refactor "Make it green, then make it clean" Saturday, 20 April, 13
  4. TDD Process • Resist the urge to pre-optimize the code.

    Just make it pass first. • By focusing on writing only the code necessary to pass tests, designs can be cleaner and clearer than is often achieved by other methods. • Too many asserts might be a sign that your function is doing too many things - break it into smaller chunks. Saturday, 20 April, 13
  5. Benefits • Better Code Design • Modular - If it

    breaks, it's isolated and easily traceable. • Testable units speed up development - Update the test case, make the code change, run the tests. • Confidence in making larger change sets. Saturday, 20 April, 13
  6. Benefits • Detect if other parts of your app is

    affected by the latest code change. • Coverage reports help you discover potential weak spots / blind spots in your code. • Tests with examples will help in simulating actual use cases in an automated manner. • Tests becomes the documentation. Saturday, 20 April, 13
  7. Practical Benefits • Small wins makes the coding process more

    enjoyable (Gamification). • TDD gives you higher confidence that your code is doing what it's suppose to. • Working code every step of the way! Saturday, 20 April, 13
  8. Adoption Strategies • Legacy Codebase • Identify critical path, generate

    skeleton test cases & write test cases. • Write tests for new features &/or code that are accessed by the new feature. Saturday, 20 April, 13
  9. Adoption Strategies • New Projects • Establish a workflow and

    make the automated test part of your release process. • Continuous Integration - Automates repetitive and tedious task of testing and integrating your software. • Continuous Deployment. Saturday, 20 April, 13
  10. Adoption Strategies • Test for Bug Busting • Find a

    bug? Write the test case to simulate it - failing test. • Write the bug fix. • Run test to ensure that bug is not repeatable or the exception is handled properly. Saturday, 20 April, 13
  11. Adoption Strategies • Developers who write their own tests might

    have a tendency to take shortcuts by writing conservative test cases. • One way to prevent this is to pair-program with another developer or a product owner when preparing the test cases. • Spec documents that includes examples can be useful to validate code behavior. Saturday, 20 April, 13
  12. Caveat • It's gonna take some time to get productive.

    • Installing & setting up testing framework. • Read: Downtime of at least 1-2 days. • Nothing is full-proof! • It's easy to get lured into a false sense of security. • Even if u have 100% coverage, it still doesn't prevent unintended usage from breaking the code. • Bugs are test cases you have not written yet. Saturday, 20 April, 13
  13. • PHPUnit is the de-facto standard for unit testing in

    PHP projects. It provides both a framework that makes the writing of tests easy as well as the functionality to easily run the tests and analyse their results. • http://phpunit.de • Created by Sebastian Bergmann Saturday, 20 April, 13
  14. Framework Support • CakePHP (PHPUnit) • CodeIgniter (CIUnit - build

    on PHPUnit) • Symfony (PHPUnit) • Yii Framework (PHPUnit) • WordPress (PHPUnit) • Drupal (Testing module) Saturday, 20 April, 13
  15. Demo Script • Installing PHPUnit. • Use existing class to

    generate tests. • Use test cases to generate class file. • Coverage Report. • Behavior Driven Development. Saturday, 20 April, 13
  16. Installing PHPUnit # pear config-set auto_discover 1 # pear install

    pear.phpunit.de/PHPUnit Saturday, 20 April, 13
  17. Behavior Driven Development (BDD) • Not just testing individual units,

    but testing the codes as a user would use your app (ie. how diff parts of your code work together). • Process is the same, just that the tests are story-based. • User stories = Specs with examples Saturday, 20 April, 13
  18. Using Doubles • "Fake it till you make it" •

    Sometimes codes being tested needs to interact with code that hasn't been written yet. • Libraries created for a specific purpose. • Eg. Written by a different team, scheduled for next iteration, just occurred to you that it's best done as a separate class. Saturday, 20 April, 13
  19. Using Doubles • Sometimes using those classes has a real

    cost involved. • eg. Time cost (network latency from DB queries or external server calls), triggers SMS, rate limited API calls. • Mock classes to simulate these objects, respond accordingly, contain the required attributes. • Only objects can be mocked, not static methods. Saturday, 20 April, 13
  20. UI Testing • UI Testing is tricky. • Selenium -

    Web browser automation • Jasmine - Javascript Unit Testing • Phantom - Headless WebKit Browser Saturday, 20 April, 13
  21. UI Testing • UI Testing is tricky. • Selenium -

    Web browser automation • Jasmine - Javascript Unit Testing • Phantom - Headless WebKit Browser • Or... just D.I.Y. Saturday, 20 April, 13