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

Test-Driven Development to avoid test painful

Test-Driven Development to avoid test painful

presented at CakeFest 2019

Kazuki Higashiguchi

November 09, 2019
Tweet

More Decks by Kazuki Higashiguchi

Other Decks in Technology

Transcript

  1. © - BASE, Inc. Common story Programmer It works. I’m

    done! Production code (but No test code) Reviewer
  2. © - BASE, Inc. Common story Programmer Production code (but

    No test code) Reviewer Write a test, please.
  3. © - BASE, Inc. Common story Programmer It is a

    pain in the neck, but I got it. Production code (but No test code) Reviewer
  4. © - BASE, Inc. Common story Programmer It works, but

    it’s difficult to write a test code. Production code (but Hard-to-Test Code)
  5. © - BASE, Inc. What this talk is about •

    Unit Test • Explain what is a test painful • Use Test-Driven Development to solve test painful
  6. © - BASE, Inc. What this talk is NOT about

    • End-to-End Test • PHPUnit basic how-to • Test executing environment (ex. CI)
  7. © - BASE, Inc. var_dump($hgsgtk); : @hgsgtk Kazuki Higashiguchi BASE

    BANK, Inc. / Dev Division / Tech Lead Software Developer CakePHP - use for business - contributor - cakephp/cakephp, cakephp/docs
  8. © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  9. © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  10. © - BASE, Inc. Cause Cause Cause Cause Cause Various

    causes of test painful Programmer Testing is terrible! Cause
  11. © - BASE, Inc. Various causes of test painful .No

    knowledge how to write unit tests .Too busy projects .No test code in production code .Too much bother to write tests .Hard-to-Test Code .Unmaintainable test codes
  12. . No knowledge how to write tests . Too busy

    projects . No test code in production code . Too much bother to write tests . Hard-to-Test Code . Unmaintainable test codes - Causes - - Possibly solutions - . Learn how to write tests . Improve project management . Legacy code improvement . Write the tests first . Testable code design . Tests with high readability and maintainability
  13. . No knowledge how to write tests . Too busy

    projects . No test code in production code . Too much bother to write tests . Hard-to-Test Code . Unmaintainable test codes - Causes - - Possibly solutions - . Learn how to write tests . Improve project management . Legacy code improvement . Write the tests first . Testable code design . Tests with high readability and maintainability FOCUS ON
  14. © - BASE, Inc. A case “Too much bother to

    write tests” Programmer It is a pain in the neck, but I got it. Production code (but No test code) Reviewer Write a test, please.
  15. © - BASE, Inc. Why does this happen? • In

    most cases, a programmer write test codes after writing production codes Programmer Write production codes Write test codes
  16. © - BASE, Inc. Why does this happen? • Writing

    tests may become “optional” process Programmer Write production codes Write test codes It works. I’m done! But I have to write test codes.
  17. © - BASE, Inc. A case “Hard-to-Test Code” Programmer It

    works, but it’s difficult to write a test code. Hard-to-Test Code Hmm
  18. © - BASE, Inc. Hard-to-Test Code “Hard-to-Test Code is one

    factor that makes it difficult to write complete, correct automated tests in a cost-effective manner.” Meszarosf, Gerard. xUnit Test Patterns: Refactoring Test Code / Chapter . Code Smells
  19. © - BASE, Inc. Why does this happen? Programmer Programmer

    smooth-sailing production code (in the middle of coding it) complete everything Testable design In the middle of coding, a programmer doesn’t take care testable design
  20. © - BASE, Inc. Why does this happen? Programmer Programmer

    It works! production code (It’s done) complete everything Hard-to- Test Code No test code is often difficult to write tests But untestable
  21. © - BASE, Inc. Summary “ . Causes of test

    painful” • There are various causes of test painful • Focus on two causes .Too much bother to write tests .Hard-to-Test Code
  22. © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  23. © - BASE, Inc. Test-Driven Development (TDD) • The goal

    of TDD is “Clean code that works” • A way of managing fear during programming • Drive development by automated testing
  24. © - BASE, Inc. Don’t write a line of new

    code unless you first have a failing automated test Eliminate duplication TDD Rules https://www.eecs.yorku.ca/course_archive/ - /W/ /sectionM/case_studies/money/ KentBeck_TDD_byexample.pdf
  25. © - BASE, Inc. TDD Cycle .Add a little test

    .Run all tests, and fail .Make a little change .Run all tests and succeed .Refactor to remove duplication https://www.eecs.yorku.ca/course_archive/ - /W/ /sectionM/case_studies/money/ KentBeck_TDD_byexample.pdf
  26. © - BASE, Inc. TDD steps .Make a to-do list

    to remind us what all we need to do .Work on the TDD cycle • “Temporary implementation” for changing from red to green quickly • Add to-do you notices along the way
  27. © - BASE, Inc. To-do list Article details API •

    Article details API request returns success response • Article details API returns article resource
  28. © - BASE, Inc. Possibly related to Cake\Controller\Exception\MissingActionE xception: "Action

    ArticlesController::view() could not be found, or is not accessible." . Run all tests, and fail DEMO
  29. © - BASE, Inc. OK ( test, assertion) . Run

    all tests and succeed DEMO
  30. © - BASE, Inc. To-do list Article details API •

    Article details API request returns success response • Article details API returns article resource DEMO
  31. © - BASE, Inc. Failed asserting that '[]' matches JSON

    string “{ }”. . Run all tests, and fail DEMO
  32. © - BASE, Inc. OK ( test, assertion) . Run

    all tests and succeed DEMO
  33. © - BASE, Inc. To-do list Article details API •

    Article details API request returns success response • Article details API returns article resource DEMO
  34. © - BASE, Inc. Principles for TDD: “ -As” pattern

    • Use separate code paragraphs for each of the As. • -As • Arrange: variable declaration and initialization • Act: invoking the code under test • Assert: verify that expectations • This pattern makes it easy to revisit test code https://integralpath.blogs.com/thinkingoutloud/ / /principles_of_t.html
  35. © - BASE, Inc. Summary “ . Test-Driven Development” •

    The goal of TDD is “Clean code that works” • TDD cycle “Red-Green-Refactor” • Make a todo list and drive TDD cycle
  36. © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  37. . No knowledge how to write tests . Too busy

    projects . No test code in production code . Too much bother to write tests . Hard-to-Test Code . Unmaintainable test codes - Causes - - Possibly solutions - . Learn how to write tests . Improve project management . Legacy code improvement . Write the tests first . Testable code design . Tests with high readability and maintainability FOCUS ON
  38. © - BASE, Inc. TDD solves two causes of test

    painful TDD • Test First • TDD Cycle Hard-to-Test Code Too much bother to write tests - Causes -
  39. © - BASE, Inc. TDD solves the cause “Too much

    bother to write tests” TDD • Test First • TDD Cycle Hard-to-Test Code Too much bother to write tests - Causes - Write the tests in TDD cycle
  40. © - BASE, Inc. Too much bother to write tests

    • In most cases, a programmer write test codes after writing production codes Programmer Write production codes Write test codes BEFORE
  41. © - BASE, Inc. Too much bother to write tests

    • Write test codes and production codes in TDD cycle • Write the tests first Programmer AFTER RED REFACT OR GREEN Write production codes Write test codes
  42. © - BASE, Inc. TDD solves the cause “Hard-to-Test Code”

    TDD • Test First • TDD Cycle Hard-to-Test Code Too much bother to write tests - Causes - Listening to the Tests
  43. © - BASE, Inc. Listening to the tests • TDD

    is about feedback on the code’s internal qualities • ex. coupling cohesion of classes, dependencies, effective information hiding Freeman, Steve. Growing Object-Oriented Software, Guided by Tests Chapter . Listening to the Tests
  44. © - BASE, Inc. Hard-to-Test Code Programmer Programmer It works!

    production code (It’s done) complete everything UnTestable design No test code is often difficult to write tests But untestable BEFORE
  45. © - BASE, Inc. Hard-to-Test Code Programmer Programmer production codes

    (with test codes) complete everything Testable design They becomes to be careful to make codes testable AFTER RED REFACT OR GREEN
  46. © - BASE, Inc. Example • A method to charge

    on order • Includes communication to external payment services
  47. © - BASE, Inc. Hard-to-Test Code BEFORE It’s difficult to

    inject CardCharge class We can’t replace the dependency (without Magic)
  48. © - BASE, Inc. . Write a little test AFTER

    • Consider Dependency Injection to write a test • It is one of benefits to write a test first
  49. © - BASE, Inc. Example • A controller action to

    handler order charge request • Save order resource • View order page
  50. © - BASE, Inc. Hard-to-Test Code BEFORE Mixed multiple use

    cases (request) Many procedures Hard-to-Test business logic code
  51. © - BASE, Inc. Make a to-do list • View

    the order page • Redirect when saving an order is succeeded • Calculate total amount of an order • Save order resource • Send charge request to external payment service • etc AFTER
  52. © - BASE, Inc. Run TDD cycle for each to-do

    • View the order page • Redirect when saving an order is succeeded • Calculate total amount of an order • Save order resource • Send charge request to external payment service • etc AFTER RED REFACT OR GREEN
  53. © - BASE, Inc. For instance • View the order

    page • Redirect when saving an order is succeeded • Calculate total amount of an order • Save order resource • Send charge request to external payment service • etc AFTER RED REFACT OR GREEN
  54. © - BASE, Inc. Calculate total amount of an order

    • This is a important logic, so many test patterns are needed • It may be better to write it in Entity AFTER
  55. © - BASE, Inc. “Your designs must consist of many

    highly cohesive, loosely coupled components, just to make testing easy” https://www.eecs.yorku.ca/course_archive/ - /W/ /sectionM/case_studies/money/ KentBeck_TDD_byexample.pdf A benefit of TDD
  56. © - BASE, Inc. Summary “ . How to Use

    Test-Driven Development” • TDD solves two causes of test painful .Too much bother to write tests .Hard-to-Test Code
  57. © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  58. © - BASE, Inc. The solution to the problem of

    costly tests, however, is not to stop testing but instead to get better at it. Metz, Sandi. Practical Object-Oriented Design / Chapter Designing Cost-Effective Tests