Slide 1

Slide 1 text

© - BASE, Inc. Test-Driven Development to avoid test painful CakeFest . . - @hgsgtk

Slide 2

Slide 2 text

© - BASE, Inc. Common story Programmer It works. I’m done! Production code (but No test code) Reviewer

Slide 3

Slide 3 text

© - BASE, Inc. Common story Programmer Production code (but No test code) Reviewer Write a test, please.

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

© - BASE, Inc. Test painful https://unsplash.com/photos/ajByNgzbklo

Slide 6

Slide 6 text

© - BASE, Inc. Common story Programmer It works, but it’s difficult to write a test code. Production code (but Hard-to-Test Code)

Slide 7

Slide 7 text

© - BASE, Inc. Common story Programmer Hmm Production code (but Hard-to-Test Code)

Slide 8

Slide 8 text

© - BASE, Inc. https://unsplash.com/photos/VBe zj-JHBs Test painful

Slide 9

Slide 9 text

https://unsplash.com/photos/jNrGkkvYk TDD solve these problems

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

© - BASE, Inc. What this talk is NOT about • End-to-End Test • PHPUnit basic how-to • Test executing environment (ex. CI)

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

. 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

Slide 18

Slide 18 text

. 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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

© - BASE, Inc. Feel test painful https://unsplash.com/photos/eQTHhpTkBTY

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

© - BASE, Inc. Feel test painful https://unsplash.com/photos/_cbKur I A

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

https://unsplash.com/photos/jNrGkkvYk TDD

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

© - BASE, Inc. TDD Cycle “Red-Green-Refactor” RED REFACTOR GREEN . Failed test . Passed . Refactor

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

DEMONSTRATION https://unsplash.com/photos/xt tb oa o

Slide 37

Slide 37 text

by CakePHP .

Slide 38

Slide 38 text

© - BASE, Inc. To-do list Article details API • Article details API request returns success response • Article details API returns article resource

Slide 39

Slide 39 text

© - BASE, Inc. . Add a little test RED REFAC TOR GREEN DEMO

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

© - BASE, Inc. . Make a little change RED REFAC TOR GREEN DEMO

Slide 42

Slide 42 text

© - BASE, Inc. OK ( test, assertion) . Run all tests and succeed DEMO

Slide 43

Slide 43 text

© - BASE, Inc. To-do list Article details API • Article details API request returns success response • Article details API returns article resource DEMO

Slide 44

Slide 44 text

© - BASE, Inc. . Add a little test RED REFAC TOR GREEN DEMO

Slide 45

Slide 45 text

© - BASE, Inc. Failed asserting that '[]' matches JSON string “{ }”. . Run all tests, and fail DEMO

Slide 46

Slide 46 text

© - BASE, Inc. . Make a little change RED REFAC TOR GREEN DEMO

Slide 47

Slide 47 text

© - BASE, Inc. OK ( test, assertion) . Run all tests and succeed DEMO

Slide 48

Slide 48 text

© - BASE, Inc. . Refactor RED REFAC TOR GREEN DEMO

Slide 49

Slide 49 text

© - BASE, Inc. . Refactor RED REFAC TOR GREEN DEMO

Slide 50

Slide 50 text

© - BASE, Inc. To-do list Article details API • Article details API request returns success response • Article details API returns article resource DEMO

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

. 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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

CASE STUDIES https://unsplash.com/photos/oBI NBP Lhg

Slide 64

Slide 64 text

© - BASE, Inc. Can’t replace dependencies Bloated class/function Case studies

Slide 65

Slide 65 text

© - BASE, Inc. Can’t replace dependencies Bloated class/function Case studies

Slide 66

Slide 66 text

© - BASE, Inc. Example • A method to charge on order • Includes communication to external payment services

Slide 67

Slide 67 text

© - BASE, Inc. Hard-to-Test Code BEFORE

Slide 68

Slide 68 text

© - BASE, Inc. Hard-to-Test Code BEFORE It’s difficult to inject CardCharge class We can’t replace the dependency (without Magic)

Slide 69

Slide 69 text

© - BASE, Inc. . Write a little test AFTER • Consider Dependency Injection to write a test • It is one of benefits to write a test first

Slide 70

Slide 70 text

© - BASE, Inc. Can’t replace dependencies Bloated class/function Case studies

Slide 71

Slide 71 text

© - BASE, Inc. Example • A controller action to handler order charge request • Save order resource • View order page

Slide 72

Slide 72 text

© - BASE, Inc. Hard-to-Test Code BEFORE • A controller action

Slide 73

Slide 73 text

© - BASE, Inc. Hard-to-Test Code BEFORE • Handle both requests

Slide 74

Slide 74 text

© - BASE, Inc. Hard-to-Test Code BEFORE • The business logic in it

Slide 75

Slide 75 text

© - BASE, Inc. Hard-to-Test Code BEFORE • Also there are another concerns

Slide 76

Slide 76 text

© - BASE, Inc. Hard-to-Test Code BEFORE Mixed multiple use cases (request) Many procedures Hard-to-Test business logic code

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

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

Slide 79

Slide 79 text

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

Slide 80

Slide 80 text

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

Slide 81

Slide 81 text

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

Slide 82

Slide 82 text

© - BASE, Inc. Business logic in Model AFTER

Slide 83

Slide 83 text

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

Slide 84

Slide 84 text

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

Slide 85

Slide 85 text

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

Slide 86

Slide 86 text

TDD solve test painful https://unsplash.com/photos/jvBXiynINGE

Slide 87

Slide 87 text

Test is a design tool https://unsplash.com/photos/IClZBVw W A

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

Any Questions?