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

TDD with PHP - The secret to coding with confidence

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. The secret to coding with confidence
    Test Driven Development
    Saturday, 20 April, 13

    View Slide

  2. Saturday, 20 April, 13

    View Slide

  3. Saturday, 20 April, 13

    View Slide

  4. Saturday, 20 April, 13

    View Slide

  5. 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

    View Slide

  6. 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

    View Slide

  7. Saturday, 20 April, 13

    View Slide

  8. 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

    View Slide

  9. 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

    View Slide

  10. 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

    View Slide

  11. 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

    View Slide

  12. 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

    View Slide

  13. 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

    View Slide

  14. 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

    View Slide

  15. 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

    View Slide

  16. 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

    View Slide

  17. Sample Spec with
    Example
    Saturday, 20 April, 13

    View Slide

  18. Sample Spec with
    Example
    Saturday, 20 April, 13

    View Slide

  19. 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

    View Slide

  20. • 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

    View Slide

  21. What is TDD?
    Saturday, 20 April, 13

    View Slide

  22. What is TDD?
    Saturday, 20 April, 13

    View Slide

  23. What is TDD?
    Saturday, 20 April, 13

    View Slide

  24. What is TDD?
    Saturday, 20 April, 13

    View Slide

  25. Framework Support
    • CakePHP (PHPUnit)
    • CodeIgniter (CIUnit - build on PHPUnit)
    • Symfony (PHPUnit)
    • Yii Framework (PHPUnit)
    • WordPress (PHPUnit)
    • Drupal (Testing module)
    Saturday, 20 April, 13

    View Slide

  26. Demo
    Saturday, 20 April, 13

    View Slide

  27. 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

    View Slide

  28. Installing PHPUnit
    # pear config-set auto_discover 1
    # pear install pear.phpunit.de/PHPUnit
    Saturday, 20 April, 13

    View Slide

  29. Sample Code
    https://github.com/miccheng/TDD-PHP-Sample
    Saturday, 20 April, 13

    View Slide

  30. 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

    View Slide

  31. 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

    View Slide

  32. 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

    View Slide

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

    View Slide

  34. 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

    View Slide

  35. End of File
    Saturday, 20 April, 13

    View Slide