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

Fake your test away: How to abuse your test doubles

Jenny Shih
November 11, 2021

Fake your test away: How to abuse your test doubles

Presented at RubyConf 2021 by Jenny Shih

https://rubyconf.com/program/sessions#session-1162

Jenny Shih

November 11, 2021
Tweet

More Decks by Jenny Shih

Other Decks in Programming

Transcript

  1. @jenny_codes
    Fake your test away
    How to abuse your test doubles

    View Slide

  2. @jenny_codes

    View Slide

  3. @jenny_codes
    @ RubyConf Taiwan 2019

    View Slide

  4. @jenny_codes
    @ RubyConf Taiwan 2019

    View Slide

  5. @jenny_codes
    @ RubyConf Taiwan 2019

    View Slide

  6. @jenny_codes
    Let’s talk about Douglas Adams

    View Slide

  7. @jenny_codes
    Let’s talk about Douglas Adams
    source: https://www.wallpaper
    fl
    are.com/don-t-panic-text-decor-the-hitchhiker-s-guide-to-the-galaxy-wallpaper-pwpgv

    View Slide

  8. @jenny_codes
    Let’s talk about Douglas Adams
    Three stages in human civilization:


    • Survival


    • Inquiry


    • Sophistication

    View Slide

  9. @jenny_codes
    Let’s talk about Douglas Adams
    Three stages in human civilization:


    • Survival: How?


    • Inquiry: Why?


    • Sophistication: Where?

    View Slide

  10. @jenny_codes
    Let’s talk about Douglas Adams
    Three stages in human civilization:


    • Survival: How can we eat?


    • Inquiry: Why?


    • Sophistication: Where?

    View Slide

  11. @jenny_codes
    Let’s talk about Douglas Adams
    Three stages in human civilization:


    • Survival: How can we eat?


    • Inquiry: Why do we eat?


    • Sophistication: Where?

    View Slide

  12. @jenny_codes
    Let’s talk about Douglas Adams
    Three stages in human civilization:


    • Survival: How can we eat?


    • Inquiry: Why do we eat?


    • Sophistication: Where shall we have lunch?

    View Slide

  13. @jenny_codes
    Let’s talk about testing

    View Slide

  14. @jenny_codes
    Three stages in my relationship with test doubles:
    Let’s talk about testing

    View Slide

  15. @jenny_codes
    Three stages in my relationship with test doubles


    • Survival: How to use test doubles?


    Let’s talk about testing

    View Slide

  16. @jenny_codes
    Three stages in my relationship with test doubles


    • Survival: How to use test doubles?


    • Inquiry: Why do I test?


    Let’s talk about testing

    View Slide

  17. @jenny_codes
    Three stages in my relationship with test doubles


    • Survival: How to use test doubles?


    • Inquiry: Why do I test?


    • Sophistication: Where shall I begin to delete my old tests?


    Let’s talk about testing

    View Slide

  18. @jenny_codes
    Outline
    • Unit tests, integration tests, and those in between


    • Integration-test wannabes


    • Helicopter unit tests


    • How to not abuse your test doubles?

    View Slide

  19. @jenny_codes
    Outline
    • Unit tests, integration tests, and those in between


    • Integration-test wannabes


    • Helicopter unit tests


    • How to not abuse your test doubles?

    View Slide

  20. @jenny_codes
    Test double

    View Slide

  21. @jenny_codes
    Test double


    ├─ Stub


    ├─ Mock


    └─ Spy

    View Slide

  22. @jenny_codes
    Subject

    View Slide

  23. @jenny_codes
    Dependency

    View Slide

  24. Imagine a perfect world

    View Slide

  25. @jenny_codes
    Testing pyramid
    Unit tests
    Integration
    tests
    Acceptance
    tests

    View Slide

  26. @jenny_codes
    Testing pyramid, reality edition
    Integration-test
    wannabes
    Helicopter
    unit tests
    Scream tests
    🤔 🤔
    🤔
    🤔

    View Slide

  27. @jenny_codes
    Testing pyramid, reality edition
    Helicopter
    unit tests
    Scream tests
    🤔 🤔
    🤔
    🤔
    Integration-test
    wannabes

    View Slide

  28. @jenny_codes
    Testing pyramid, reality edition
    Helicopter
    unit tests
    Scream tests
    🤔 🤔
    🤔
    🤔
    Integration-test
    wannabes

    View Slide

  29. @jenny_codes
    Testing pyramid, reality edition
    Helicopter
    unit tests
    Scream tests
    🤔 🤔
    🤔
    🤔
    Integration-test
    wannabes

    View Slide

  30. @jenny_codes
    Outline
    • Unit tests, integration tests, and those in between


    • Integration-test wannabes


    • Helicopter unit tests


    • How to not abuse your test doubles?

    View Slide

  31. @jenny_codes
    A restaurant that serves French toast

    View Slide

  32. @jenny_codes
    A restaurant that serves French toast

    View Slide

  33. @jenny_codes
    A restaurant that serves French toast

    View Slide

  34. @jenny_codes
    A restaurant that serves French toast

    View Slide

  35. @jenny_codes
    A restaurant that serves French toast

    View Slide

  36. @jenny_codes
    The test

    View Slide

  37. @jenny_codes
    The test

    View Slide

  38. @jenny_codes
    🤔
    The test

    View Slide

  39. @jenny_codes

    View Slide

  40. @jenny_codes
    🔎

    View Slide

  41. @jenny_codes
    🔎

    View Slide

  42. @jenny_codes
    🔎
    🚨

    View Slide

  43. @jenny_codes

    View Slide

  44. @jenny_codes

    View Slide

  45. @jenny_codes

    View Slide

  46. @jenny_codes

    View Slide

  47. @jenny_codes

    View Slide

  48. @jenny_codes

    View Slide

  49. @jenny_codes

    View Slide

  50. @jenny_codes

    View Slide

  51. @jenny_codes

    View Slide

  52. @jenny_codes

    View Slide

  53. @jenny_codes

    View Slide

  54. @jenny_codes

    View Slide

  55. @jenny_codes
    Integration-test wannabes (n.)
    Tests with randomly inserted test doubles because the real objects are
    too awkward to deal with.

    View Slide

  56. @jenny_codes
    ❌ Random doubles == Random test failures
    Integration-test wannabes

    View Slide

  57. @jenny_codes
    One month later…

    View Slide

  58. @jenny_codes
    One month later…
    FAILED

    View Slide

  59. @jenny_codes
    Therapeutic Refactoring by Katrina Owen, Cascadia Ruby Conf 2012

    View Slide

  60. @jenny_codes

    View Slide

  61. @jenny_codes
    when I don’t have to modify
    100 random test failures for it

    View Slide

  62. @jenny_codes
    ❌ Random doubles == Random test failures


    ❌ Decreased productivity
    Integration-test wannabes

    View Slide

  63. Test doubles are contracts

    View Slide

  64. @jenny_codes
    Outline
    • Unit tests, integration tests, and those in between


    • Integration-test wannabes


    • Helicopter unit tests


    • How to not abuse your test doubles?

    View Slide

  65. @jenny_codes
    Restaurant Service: Cheese Panini

    View Slide

  66. @jenny_codes

    View Slide

  67. @jenny_codes

    View Slide

  68. @jenny_codes

    View Slide

  69. @jenny_codes

    View Slide

  70. @jenny_codes
    Chef
    Waiter
    Restaurant


    Service
    The dependency graph
    Floor
    🛸
    🌝
    🐢
    Cupboard
    Fridge
    Bread
    Cheese
    class-level dependency
    instance-level dependency

    View Slide

  71. @jenny_codes
    The dependency graph
    🙈
    🙈
    Chef
    Waiter
    Restaurant


    Service
    Cupboard
    Fridge
    Bread
    Cheese
    class-level dependency
    instance-level dependency
    test double
    🙈
    🙈
    🙈

    View Slide

  72. @jenny_codes
    The dependency graph
    🙈
    🙈
    Chef
    Waiter
    Restaurant


    Service
    class-level dependency
    instance-level dependency
    test double
    🙈
    🙈
    🙈
    🙈
    🙈

    View Slide

  73. @jenny_codes

    View Slide

  74. @jenny_codes

    View Slide

  75. @jenny_codes

    View Slide

  76. @jenny_codes

    View Slide

  77. @jenny_codes

    View Slide

  78. @jenny_codes

    View Slide

  79. @jenny_codes

    View Slide

  80. @jenny_codes

    View Slide

  81. @jenny_codes
    Helicopter unit tests (n.)
    Tests that try to control every implementation detail in the subject.

    View Slide

  82. @jenny_codes
    ❌ Fake empire
    The helicopter unit tests

    View Slide

  83. @jenny_codes https://media.giphy.com/media/IguL9zRYV20X1QeKuV/giphy.gif
    Production
    Your CI
    The helicopter unit tests

    View Slide

  84. @jenny_codes
    ❌ Fake empire


    ❌ Brittle tests
    The helicopter unit tests

    View Slide

  85. @jenny_codes
    ❌ Fake empire


    ❌ Brittle tests
    The helicopter unit tests
    GUARANTEED

    View Slide

  86. @jenny_codes
    ❌ Fake empire


    ❌ Brittle tests


    The helicopter unit tests
    x N

    View Slide

  87. @jenny_codes
    Outline
    • Unit tests, integration tests, and those in between


    • Integration-test wannabes


    • Helicopter unit tests


    • How to not abuse your test doubles?

    View Slide

  88. @jenny_codes
    hard-to-use code == hard-to-write test
    easy-to-use code == easy-to-write test

    View Slide

  89. @jenny_codes
    Tests are the first consumer of your API

    View Slide

  90. @jenny_codes
    https://twitter.com/dan_abramov/status/1456265490754510848/photo/1
    Write an unit test
    that can’t catch errors
    Write an integration test
    that has holes it

    View Slide

  91. @jenny_codes
    • 🎁


    • 🎁


    • 🎁
    How to not abuse your test doubles?

    View Slide

  92. @jenny_codes
    • Use the Principle of Least Knowledge


    • 🎁


    • 🎁
    How to not abuse your test doubles?

    View Slide

  93. @jenny_codes
    Principle of Least Knowledge
    Don’t talk to strangers

    View Slide

  94. @jenny_codes
    Principle of Least Knowledge

    View Slide

  95. @jenny_codes
    Principle of Least Knowledge
    Life Universe Everything
    Answer

    View Slide

  96. @jenny_codes
    Principle of Least Knowledge
    Life Universe Everything
    Answer

    View Slide

  97. @jenny_codes
    Principle of Least Knowledge
    Life Universe
    Answer
    Everything

    View Slide

  98. @jenny_codes
    Principle of Least Knowledge
    Answer
    Everything
    Universe
    Life

    View Slide

  99. @jenny_codes
    Principle of Least Knowledge
    Don’t talk to strangers


    Low coupling

    View Slide

  100. @jenny_codes
    Principle of Least Knowledge
    Don’t talk to strangers


    Low coupling

    View Slide

  101. @jenny_codes
    Principle of Least Knowledge
    Don’t talk to strangers


    Low coupling

    View Slide

  102. @jenny_codes

    View Slide

  103. @jenny_codes

    View Slide

  104. @jenny_codes

    View Slide

  105. @jenny_codes

    View Slide

  106. @jenny_codes

    View Slide

  107. @jenny_codes

    View Slide

  108. @jenny_codes
    Use Principle of Least Knowledge: Result

    View Slide

  109. @jenny_codes
    Use Principle of Least Knowledge: Result

    View Slide

  110. @jenny_codes
    • Use the Principle of Least Knowledge


    • 🎁


    • 🎁
    How to not abuse your test doubles?

    View Slide

  111. @jenny_codes
    How to not abuse your test doubles?
    • Use the Principle of Least Knowledge


    • Separate decisions and delegations.


    • 🎁

    View Slide

  112. @jenny_codes
    Decision
    • Logic


    • Condition


    • Calculation
    • Dependency


    • Relationships
    Delegation

    View Slide

  113. @jenny_codes

    View Slide

  114. @jenny_codes
    = delegation
    = decision

    View Slide

  115. @jenny_codes
    1. Get resources


    2. Prepare ingredients


    3. Make dish


    4. Serve dish

    View Slide

  116. @jenny_codes
    1. Get resources

    View Slide

  117. @jenny_codes
    1. Get resources


    2. Prepare ingredients


    3. Make dish


    4. Serve dish

    View Slide

  118. @jenny_codes
    1. Get resources


    2. Prepare ingredients


    3. Make dish


    4. Serve dish
    => waiter
    => waiter
    => chef

    View Slide

  119. @jenny_codes
    Separate decision and delegation: Result

    View Slide

  120. @jenny_codes
    Separate decision and delegation: Result

    View Slide

  121. @jenny_codes

    View Slide

  122. @jenny_codes

    View Slide

  123. @jenny_codes

    View Slide

  124. @jenny_codes
    Separate decision and delegation: Result
    Arrange
    Act
    Assert

    View Slide

  125. @jenny_codes
    Separate decision and delegation: Result

    View Slide

  126. @jenny_codes
    Decision
    • Logic


    • Condition


    • Calculation


    • Unit test
    • Dependency


    • Relationships
    Delegation

    View Slide

  127. @jenny_codes
    Decision
    • Logic


    • Condition


    • Calculation


    • Unit test
    • Dependency


    • Relationships


    • Integration test
    Delegation

    View Slide

  128. @jenny_codes
    Testing pyramid with decision and delegation
    Unit tests
    Integration
    tests
    Acceptance
    tests
    Decisions
    Delegation

    View Slide

  129. @jenny_codes
    How to not abuse your test doubles?
    • Use the Principle of Least Knowledge


    • Separate decisions and delegations


    • 🎁

    View Slide

  130. @jenny_codes
    • Use the Principle of Least Knowledge


    • Separate decision and delegation


    • Make the dependencies really obvious
    How to not abuse your test doubles?

    View Slide

  131. @jenny_codes
    All dependencies are equal,


    but some are more equal than others.

    View Slide

  132. @jenny_codes
    All dependencies are equal,


    but some are more equal than others.
    the side-e
    ff
    ect free the rest

    View Slide

  133. @jenny_codes
    All dependencies are equal,


    but some are more equal than others.
    the side-e
    ff
    ect free the rest
    🤤

    View Slide

  134. @jenny_codes
    All dependencies are equal,


    but some are more equal than others.
    the side-e
    ff
    ect free the rest
    🤤 ⚠

    View Slide

  135. @jenny_codes
    the side-e
    ff
    ect free
    🤤
    All dependencies are equal,


    but some are more equal than others.
    the rest





    ⚠⚠⚠

    View Slide

  136. @jenny_codes
    Revisit serve_french_toast

    View Slide

  137. @jenny_codes
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸
    🌝
    🐢
    class-level dependency
    instance-level dependency
    Revisit serve_french_toast

    View Slide

  138. @jenny_codes
    Revisit serve_french_toast
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸
    🌝
    🐢
    class-level dependency
    instance-level dependency

    View Slide

  139. @jenny_codes
    Revisit serve_french_toast
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸
    🌝
    🐢
    class-level dependency
    instance-level dependency

    View Slide

  140. @jenny_codes
    Revisit serve_french_toast
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸
    🌝
    🐢
    class-level dependency
    instance-level dependency

    View Slide

  141. @jenny_codes
    Revisit serve_french_toast
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸
    🌝
    🐢
    class-level dependency
    instance-level dependency
    How to make those
    dependencies obvious?

    View Slide

  142. @jenny_codes
    Revisit serve_french_toast
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸
    🌝
    🐢
    class-level dependency
    instance-level dependency

    View Slide

  143. @jenny_codes
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸 🌝 🐢

    View Slide

  144. @jenny_codes
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸
    🌝
    🐢

    View Slide

  145. @jenny_codes
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸
    🌝
    🔻
    🐢
    Restaurant


    Repo

    View Slide

  146. @jenny_codes
    Chef
    Waiter
    Restaurant


    Service
    Floor
    🛸
    🌝
    🔻
    🐢
    Restaurant


    Repo

    View Slide

  147. @jenny_codes

    View Slide

  148. @jenny_codes



    View Slide

  149. @jenny_codes

    View Slide

  150. @jenny_codes

    View Slide

  151. @jenny_codes
    Make dependencies obvious: Result

    View Slide

  152. @jenny_codes
    Make dependencies obvious: Result

    View Slide

  153. @jenny_codes
    Make dependencies obvious: Result

    View Slide

  154. @jenny_codes
    • Use the Principle of Least Knowledge


    • Separate decision and delegation


    • Make the dependencies really obvious
    How to not abuse your test doubles?

    View Slide

  155. @jenny_codes
    Design your system


    so there’s no room to abuse your test doubles

    View Slide

  156. One last thing

    View Slide

  157. @jenny_codes
    Talks that inspire me
    • Gary Bernhardt: Boundaries


    • Justin Searls: Please don’t mock me


    • Justin Searls: How to stop hating your test


    • Katrina Owen: Therapeutic refactoring


    • All the talks by Sandi Metz really

    View Slide

  158. @jenny_codes
    Books that inspire me
    • The Art of Unit Testing by Roy Osherove


    • Domain Modeling Made Functional by Scott Wlaschin


    • The Hitchhiker’s Guide to the Galaxy by Douglas Adams

    View Slide

  159. @jenny_codes
    Talk to me!
    or just
    @jenny_codes

    View Slide