Test-Driven Development to avoid test painful

Test-Driven Development to avoid test painful

presented at CakeFest 2019

88964b936e864ca7d326272eaa70fa9a?s=128

Kazuki Higashiguchi

November 09, 2019
Tweet

Transcript

  1. 2.

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

    done! Production code (but No test code) Reviewer
  2. 3.

    © - BASE, Inc. Common story Programmer Production code (but

    No test code) Reviewer Write a test, please.
  3. 4.

    © - BASE, Inc. Common story Programmer It is a

    pain in the neck, but I got it. Production code (but No test code) Reviewer
  4. 6.

    © - BASE, Inc. Common story Programmer It works, but

    it’s difficult to write a test code. Production code (but Hard-to-Test Code)
  5. 10.

    © - BASE, Inc. What this talk is about •

    Unit Test • Explain what is a test painful • Use Test-Driven Development to solve test painful
  6. 11.

    © - BASE, Inc. What this talk is NOT about

    • End-to-End Test • PHPUnit basic how-to • Test executing environment (ex. CI)
  7. 12.

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

    © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  9. 14.

    © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  10. 15.

    © - BASE, Inc. Cause Cause Cause Cause Cause Various

    causes of test painful Programmer Testing is terrible! Cause
  11. 16.

    © - 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. 17.

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

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

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

    © - 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. 21.

    © - 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. 23.

    © - 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. 24.

    © - 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. 25.

    © - 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. 26.

    © - 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. 28.

    © - 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. 29.

    © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  23. 31.

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

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

    © - 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. 35.

    © - 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. 38.

    © - BASE, Inc. To-do list Article details API •

    Article details API request returns success response • Article details API returns article resource
  28. 39.
  29. 40.

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

    © - BASE, Inc. OK ( test, assertion) . Run

    all tests and succeed DEMO
  31. 43.

    © - BASE, Inc. To-do list Article details API •

    Article details API request returns success response • Article details API returns article resource DEMO
  32. 44.
  33. 45.

    © - BASE, Inc. Failed asserting that '[]' matches JSON

    string “{ }”. . Run all tests, and fail DEMO
  34. 47.

    © - BASE, Inc. OK ( test, assertion) . Run

    all tests and succeed DEMO
  35. 50.

    © - BASE, Inc. To-do list Article details API •

    Article details API request returns success response • Article details API returns article resource DEMO
  36. 51.

    © - 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
  37. 52.

    © - 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
  38. 53.

    © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  39. 54.

    . 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
  40. 55.

    © - 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 -
  41. 56.

    © - 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
  42. 57.

    © - 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
  43. 58.

    © - 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
  44. 59.

    © - 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
  45. 60.

    © - 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
  46. 61.

    © - 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
  47. 62.

    © - 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
  48. 66.

    © - BASE, Inc. Example • A method to charge

    on order • Includes communication to external payment services
  49. 68.

    © - BASE, Inc. Hard-to-Test Code BEFORE It’s difficult to

    inject CardCharge class We can’t replace the dependency (without Magic)
  50. 69.

    © - BASE, Inc. . Write a little test AFTER

    • Consider Dependency Injection to write a test • It is one of benefits to write a test first
  51. 71.

    © - BASE, Inc. Example • A controller action to

    handler order charge request • Save order resource • View order page
  52. 76.

    © - BASE, Inc. Hard-to-Test Code BEFORE Mixed multiple use

    cases (request) Many procedures Hard-to-Test business logic code
  53. 77.

    © - 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
  54. 78.

    © - 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
  55. 79.

    © - 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
  56. 80.

    © - 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
  57. 83.

    © - 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
  58. 84.

    © - 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
  59. 85.

    © - BASE, Inc. Agenda .Causes of test painful .Test-Driven

    Development .How to Use Test-Driven Development .Summary
  60. 88.

    © - 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