Clean Test Code Revised

Clean Test Code Revised

Rails Developer Meetup 2019での発表資料です!可読性の高いテストコードを書くためのコツについて話しました

6ac7c50770603b53964d44db373e8e48?s=128

Shinichi Maeshima

March 23, 2019
Tweet

Transcript

  1. Clean Test Code Revised @willnet

  2. Έͳ͞Μ ςετॻ͍ͯ·͔͢ʁ

  3. ͜͜Ͱશһख্͕͕ Δ༧ఆ✋

  4. ςετॻ͘ͷָ͍͠ ਓʁ

  5. ͜͜Ͱશһ͕໨Λ෬ ͤΔ༧ఆ

  6. Ͳ͏͍͏ͱ͖ʹͭΒ͍ʁ w ͨ·ʹ$*͚ͩͰίέΔςετ w ͳʹΛͲ͏ςετͯ͠Δͷ͔Θ͔Βͳ͍ςετίʔυͷղ ಡ w ςετͷఆٛΛҰͭมߋͨ͠Βେྔͷ

  7. Ͳ͏͍͏ͱ͖ʹͭΒ͍ʁ w ͨ·ʹ$*͚ͩͰίέΔςετ w ͳʹΛͲ͏ςετͯ͠Δͷ͔Θ͔Βͳ͍ςετίʔυͷղ ಡ w ςετͷఆٛΛҰͭมߋͨ͠Βେྔͷ طଘͷςετίʔυ मਖ਼͕ͭΒ͍

  8. Ͳ͏͍͏ͱ͖ʹͭΒ͍ʁ w ͨ·ʹ$*͚ͩͰίέΔςετ w ͳʹΛͲ͏ςετͯ͠Δͷ͔Θ͔Βͳ͍ςετίʔυ w ఆٛΛҰͭมߋͨ͠Βେྔͷ A ࠓ೔࿩͢͜ͱ

  9. Մಡੑͷߴ͍ίʔυΛ मਖ਼͢ΔͳΒਏ͘ͳ͍͸ͣʜ

  10. 8F`SFOPUIJSJOH ҎલɺՄಡੑͷߴ͍ ςετίʔυͷॻ͖ํ ʹ͍ͭͯ࿩͠·ͨ͠ https://speakerdeck.com/willnet/clean-test-code

  11. 3BJMT%FWFMPQFST .FFUVQ ӫ͑͋ΔୈҰճ໨ʂ

  12. ൃද͔Β೥ܦͪ ಄͕੔ཧ͞Ε͖ͯͨͷͰ΋ͬ ͱ͍͍ײ͡ͷઆ໌͕Ͱ͖ͦ͏

  13. ͔͜͜Βຊ୊

  14. ࠓ೔͸$MFBO5FTU $PEF Մಡੑͷߴ͍ς ετίʔυ ʹ͍ͭͯ ࿩͠·͢

  15. Ͳ͏͍͏ঢ়ଶͩͱ ʮՄಡੑͷߴ͍ςετ ίʔυʯͱݴ͑Δͷ͔

  16. ཧ૝ͷ͕࢟Θ͔Βͳ͍ ͱमਖ਼͠Α͏͕ͳ͍ʜ

  17. ೴ʹෛ୲Λ͔͚ͳ͍ ςετίʔυ͸Մಡੑ ͕ߴ͍

  18. ๻ͨͪ͸ςετίʔυ ΛಡΉͱ͖ɺςετͷ ಺༰Λ೴಺ϝϞϦʹల ։͍ͯ͠Δ

  19. ೴಺ϝϞϦʹల։͍ͯ͠Δ ཁૉ w ςετͷ֓ཁ w ςετͷࣄલ৚݅ w खଓ͖ w ظ଴͍ͯ͠Δ݁Ռ

  20. αϯϓϧίʔυ

  21. ֓ཁ 6TFSGVMMOBNF͕੏ͱ໊Λ͋Θͤͨ΋ͷΛ ฦ͢͜ͱΛςετ͍ͯ͠Δ

  22. લఏ৚݅ pSTUOBNF͕`ਅҰ` MBTUOBNF͕`લౡ`ͷ 6TFSΦϒδΣΫτΛੜ੒͠ɺVTFSͰࢀরͰ͖ΔΑ͏ʹ͍ͯ͠Δ

  23. खଓ͖ VTFSGVMMOBNFΛ࣮ߦ͢Δ

  24. ظ଴͢Δ݁Ռ bલౡਅҰ`͕໭Γ஋ͱͯ͠ฦΔ

  25. ςετίʔυ͔Β ΁ͷϚοϐϯά

  26. ͜ΕΒΛ͢ΜͳΓల։͞ ͤͳ͍ཁૉ͕ଘࡏ͢Δ

  27. ೴ʹෛ୲Λ͔͚Δཁૉ Λഉআͨ͠ςετίʔ υ͸Մಡੑ͕ߴ͍

  28. ೴ʹෛ୲Λ͔͚Δཁૉ ͱ͸

  29. ೴ʹෛ୲Λ͔͚Δཁૉ w આ໌ෆ଍ w είʔϓʹϊΠζ͕͍ࠞͬͯ͟Δ w είʔϓͷඈͼ஍ w ҉໧తͳґଘ͕͋Δ w

    ఆٛΛ్தͰมߋ͢Δ
  30. આ໌ෆ଍

  31. આ໌ෆ଍ w EFTDSJCF DPOUFYU JUͷઆ໌͕ࡶɺ΋͘͠͸આ໌͕ͳ͍ w ςετͷ֓ཁ͕͙͢ʹ͔ͭΊͣɺ೴ͷϦιʔεΛফඅ͢Δ

  32. None
  33. EFTDSJCF΍DPOUFYU͕୯ޠ͚ͩ JUͷઆ໌͕লུ ͳʹΛͲ͏ςετ͍ͯ͠Δͷ͔͙͢ʹ͸Θ͔Βͳ͍

  34. None
  35. จষΛಡΉ͚ͩͰ ֓ཁ͕͙͢ʹΘ͔Δʂ

  36. ཧ૝͸EFTDSJCF  DPOUFYU JUΛಡΊ͹ςε τͷྲྀΕΛཧղͰ͖Δ͜ͱ

  37. ݱ৔ͷςετίʔυͰ͸ JUͷઆ໌͕লུ͞Ε͕ͪ

  38. ॻ͍ͨຊਓʹͱͬͯ͸ࣗ ໌͔΋͠Εͳ͍͚Ͳɺ ޙੈͷਓ͕ͭΒ͍ͷͰ ৄ͘͠ॻ͖·͠ΐ͏

  39. JUͷઆ໌Λলུͯ͠Α͍ͷ͸ɺϫϯϥΠφʔܗ ࣜͰ͔ͭTVCKFDUͱϚονϟ͕୯७ͳ΋ͷ͚ͩ

  40. ·ͱΊ ςετ͸આ໌͗͢͠ ͘Β͍Ͱͪΐ͏ͲΑ͍

  41. είʔϓʹϊΠζ͕ࠞ ͍ͬͯ͟Δ

  42. ͜͜Ͱ͍͏είʔϓͱ͸ ֘౰͢Δςετʹؔ܎͢Δ ϒϩοΫͷ͜ͱͰ͢

  43. ͷείʔϓ

  44. ͷείʔϓ

  45. ྫCͱDͰ͚ͩ࢖͏ ఆ͕ٛ͋Δ

  46. %3:ʹ͢ΔͨΊʹ Ұ্ͭʹҠಈ

  47. %3:ʹ͢ΔͨΊʹ Ұ্ͭʹҠಈ (

  48. %3:ʹ͢ΔͨΊʹ Ұ্ͭʹҠಈ ͜ͷఆٛ͸ࠓݟ͍ͯΔε ίʔϓͰ࢖ΘΕ͍ͯΔͷ ͔ʁ࢖ΘΕ͍ͯͳ͍ͷ ͔ʁͱ͍͏൑அ͕ඞཁʹ ͳΓ೴ͷϦιʔεΛফඅ ͢Δ

  49. MFUΛMFUʹ͢Δͱ஗ԆධՁͰ`B`ͷίϯς ΩετͰ͸࣮ߦ͞Εͳ͍͔ΒΑ͍ͷͰ͸ʁ

  50. MFUΛMFUʹ͢Δͱ஗ԆධՁͰ`B`ͷίϯς ΩετͰ͸࣮ߦ͞Εͳ͍͔ΒΑ͍ͷͰ͸ʁ (

  51. MFUΛMFUʹ͢Δͱ஗ԆධՁͰ`B`ͷίϯς ΩετͰ͸࣮ߦ͞Εͳ͍͔ΒΑ͍ͷͰ͸ʁ MFUͷ஗Ԇ࣮ߦʹΑͬͯϚ γϯ্Ͱ࣮ߦ͞Εͳͯ͘ ΋೴ͷϝϞϦ͸ফඅ͞Ε Δ

  52. MFUͱMFUͲͪΒͰ΋ ྑ͍৔߹͸MFU

  53. ·ͱΊ είʔϓʹ͸࢖͏΋ͷ ͚ͩΛఆٛ͢Δ

  54. είʔϓͷඈͼ஍

  55. None
  56. ΤσΟλΛεΫϩʔϧ ͍ͯ͠Δؒʹ೴಺ϝϞ Ϧ͕شൃ͕ͪ͠

  57. ͜ͷྫ͸͏·͍ ղܾࡦ͕ͳ͍ʼʻ ͋Μ·ΓͭΒ͍Α͏ͳΒ ωετΛ΍ΊΔͷ͕Αͦ͞͏

  58. None
  59. ผϑΝΠϧͷఆٛΛߦͬͨΓ དྷͨΓ͍ͯ͠Δؒʹ೴಺ϝϞ Ϧ͕شൃ͕ͪ͠

  60. ϑΝΠϧதͰ͔͠࢖͍ͬͯͳ͍ ϔϧύϝιουͳΒ͜͏͍ͨ͠

  61. ·ͱΊ είʔϓͷඈͼ஍ΛͰ͖Δݶ ΓݮΒ͢ɻ΍ΉΛಘͳ͍ͱ͖ ΋ͳΔ΂ۙ͘͘ʹ഑ஔ͢Δ

  62. ҉໧తͳґଘ

  63. TUBUVT͸SFBEZEPJOHEPOFͷҰํ޲͔͠ભҠͰ͖ͳ͍ ͦΕҎ֎ͷભҠΛ͠Α͏ͱͨ͠ΒΤϥʔͱ͍͏࢓༷

  64. None
  65. TUBUVTͷσϑΥϧτ͕SFBEZͰ͋Δ͜ͱʹґଘ͍ͯ͠Δ͕ɺ ςετίʔυ୯ମΛΈ͚ͨͩͰ͸ؾ͚ͮͳ͍

  66. TUBUVTͷσϑΥϧτ͕SFBEZͰ͋Δ͜ͱʹґଘ͍ͯ͠Δ͕ɺ ςετίʔυ୯ମΛΈ͚ͨͩͰ͸ؾ͚ͮͳ͍ ΋ͪΖΜςετέʔε͕଍Γͳ͍ ͱ͍͏ͷ΋͋Δ͚ͲͦΕ͸ஔ͍͓͍͍ͯͯͩ͘͞

  67. ςετίʔυதʹॻ͔Ε ͍ͯͳ͍҉໧తͳ৚݅ FYGBDUPSZ@CPUͷσ ϑΥϧτ஋ ʹґଘͨ͠ ίʔυΛॻ͘ͱɺࣄલ৚ ݅ͷ೺Ѳ͕೉͘͠ͳΔ

  68. ࣄલ৚݅Λਖ਼͘͠೺ѲͰ͖ ͳ͍ঢ়ଶͰςετίʔυΛ ॻ͘ͱɺಡΈͮΒ͍ෆ҆ఆ ͳςετίʔυʹͳΔ

  69. ΋ͪΖΜσϑΥϧτ஋Λ มߋͨ͠Βͱ͍͏ͷ΋͋Δ

  70. ඞཁͷͳ͍ϊΠζ

  71. ͋Δ΂͖࢟

  72. ͖ͬ͞΋ݴ͚ͬͨͲ େࣄͳ͜ͱͳͷͰ ΋͏Ұ౓

  73. ςετʹؔ܎͍ͯ͠Δ ஋Λɺςετίʔυ֎ ʹॻ͘ͱͭΒ͍

  74. ͭΒ͍

  75. ςετʹؔ܎͍ͯ͠Δ ஋Λɺςετίʔυ্ Ͱաෆ଍ͳ͘໌ࣔతʹ ࢦఆ͢ΔͱಡΈ΍͍͢

  76. ͜ͷதʹ͢΂ͯΛॻ͍͍ͯͩ͘͞ʂ

  77. ͱ͸͍͑ɺ 'BDUPSZ#PUͷσϑΥ ϧτ஋ʹґଘͨ͠ίʔ υ͸ॻ͍ͯ͠·͍͕ͪ

  78. ਪ঑ϓϥΫςΟε ʮσϑΥϧτ஋Λϥϯ μϜʹ͢Δʯ

  79. ඞཁͳ஋ͷઃఆʹෆ଍͕͋Δͱ ͱ͖Ͳ͖ςετ͕ίέΔΑ͏ʹͳΔ

  80. 2ϥϯμϜʹ͢Δͱ ςετ͕ίέͨͱ͖ʹ ࠶ݱͰ͖ͳ͘ͳ͍ʁ

  81. "ςετ͕ίέͨͱ͖ ͸ASTQFDŠTFFE AͷΑ͏ʹTFFE ஋Λࢦఆ͢Δͱ࠶ݱͰ ͖Δ

  82. ·ͱΊ ςετʹؔ࿈͍ͯ͠Δ஋ ΛͳΔ΂͘ςετίʔυ ಺ʹدͤͯදݱ͢Δɻա ෆ଍͕ͳ͍Α͏ʹ͢Δ

  83. ఆٛΛ్தͰมߋ͢Δ

  84. None
  85. ҉໧ͷґଘ

  86. ͜Εʹґଘͨ͠ςετίʔυ͕͢Ͱʹଘࡏ͢Δͱ ͜ͷఆٛΛมߋ͠ʹ͘͘ͳΔ

  87. ґଘΛͦͷ··࢖ͬͯ ແཧ΍ΓςετΛॻ͍ͨྫ

  88. σϑΥϧτ஋͕໌ࣔతͰͳ͍ ͷͰɺGBDUPSZͷϑΝΠϧͱ ςετͷϑΝΠϧΛߦͬͨΓདྷͨΓ ͢Δඞཁ͕͋Δ

  89. ಈతʹσϑΥϧτ஋Λ ม͑Δͱ࠷ऴతͳ஋͕ ෼͔ΓͮΒ͘ͳΔ

  90. USBJUΛ࢖͍ɺσϑΥϧτͰ͸ QPTU͕࡞ΒΕͳ͍Α͏ʹมߋ

  91. ґଘ͍ͯ͠Δ΋ͷΛ໌ࣔతʹͯ͠ ςετίʔυຊମʹॻ͘͜ͱ͕Ͱ͖ͨ

  92. ྫΛ΋͏গ͠

  93. None
  94. ֎ଆͷείʔϓͰఆٛͨ͠QPTUΛVQEBUF͍ͯ͠ΔͷͰɺ ೴಺NFSHF͕ඞཁ

  95. ͦΕͧΕͷείʔϓͰ໌ࣔతʹQPTUΛఆٛͨ͠΄͏͕ Θ͔Γ΍͍͢

  96. None
  97. ֎ଆͷMFUͰఆٛͨ͠QVCMJTI@BUΛ্ॻ͖ͨ͠Γ ͍ͯ͠ͳ͔ͬͨΓ͢ΔͷͰɺ೴಺ϑΟϧλϦϯά͕ඞཁ

  98. σϑΥϧτͷMFUΛ΍Ίͯ ͦΕͧΕͷDPOUFYUͰ໌ࣔతʹఆٛ͢Δͱ ೴಺ϑΟϧλϦϯά͕ෆཁʹͳΔ

  99. ֎ଆͷείʔϓͰఆٛ ͨ͠΋ͷΛ಺ଆͷε ίʔϓͰߋ৽͢Δͱ೴ ʹෛ୲͕͔͔Δ

  100. ·ͱΊ ςετͷલఏ৚݅Λ্ ॻ͖ͨ͠Γमਖ਼ͨ͠Γ ͠ͳ͍

  101. ೴ʹෛ୲Λ͔͚Δཁૉ ʹ͍ͭͯҰ௨Γ࿩ͨ͠

  102. ೴ʹෛ୲Λ͔͚Δཁૉ ࠶ܝ w આ໌ෆ଍ w είʔϓʹϊΠζ͕͍ࠞͬͯ͟Δ w είʔϓͷඈͼ஍ w ҉໧తͳґଘ͕͋Δ

    w ఆٛΛ్தͰมߋ͢Δ
  103. ೴ʹෛ୲Λ͔͚Δཁૉ Λෳ਺ؚΈ͕ͪͳ΋ͷ ͕͋Δ

  104. ͦΕ͸ʜ

  105. TIBSFE@DPOUFYU TIBSFE@FYBNQMFT

  106. ͜ΕͰۤ͠ΜͩPS ۤ͠ΜͰ͍Δਓ✋

  107. %3:ʹ͍ͨ͠ཉٻ͕ TIBSFE଒Λঌש͢Δ

  108. TIBSFE଒Λ࢖͏ͳ Βɺ͜Ε·Ͱ࿩ͨ͠ϓ ϥΫςΟεΛͰ͖Δ͔ ͗Γ੝ΓࠐΈ·͠ΐ͏

  109. None
  110. આ໌͕଍Γͳ͍

  111. Ṗͷґଘؔ܎

  112. TIBSFE@FYBNQMFTͷఆٛͱ ςετίʔυΛߦͬͨΓདྷͨ Γͯ͠ɺ೴಺Ͱ ʮTIBSFE@FYBNQMFTΛ࢖Θ ͳ͔ͬͨͱ͖ͷίʔυʯʹม ׵͠ͳ͍ͱͳʹ΋Θ͔Βͳ͍

  113. मਖ਼Ҋ

  114. આ໌Λৄͯ͘͠͠ ςετίʔυ಺͚ͩͰ֓ཁΛ͔ͭΊΔΑ͏ʹͨ͠

  115. ͔͠͠Ҿ਺ʹظ଴͢Δ݁ՌΛ౉ͯ͠ಈతʹJUͷ಺༰Λมߋ͢Δ ͱ͍͏͜ͱࣗମ͕ՄಡੑΛଛͶ͍ͯΔ ݁ہఆٛΛಡΜͰ೴಺Ϛʔδͷඞཁ͕͋Δ

  116. ΂ͨॻ͖ʹͯ͠Έͨ

  117. ݟ΍͘͢ͳ͕ͬͨ ιʔείʔυߦ਺͸૿͑ͨ

  118. όϥϯεΛ ߟ͑·͠ΐ͏

  119. Լखʹ෼͚Δ͘Β͍ͳ ΒίϐϖͰ΂ͨॻ͖ͷ ΄͏͕ίετ௿͍Ͱ͢

  120. શମͷ·ͱΊ w Մಡੑͷߴ͍ςετͷॻ͖ํʹ͍ͭͯઆ໌͠·ͨ͠ w ςετίʔυ͸ΞϓϦέʔγϣϯίʔυͱͪΐͬͱ͚͓ͩ ࡞๏͕ҧ͏ w ΞϓϦέʔγϣϯίʔυ΄ͲՄಡੑ͕ߟྀ͞Ε͍ͯͳ͍ง ғؾ w

    ςετίʔυ΋ΞϓϦέʔγϣϯΛߏ੒͢ΔίʔυͷҰ෦ ͳͷͰɺಡΈ΍͍͢ίʔυʹ͍͖ͯ͠·͠ΐ͏Ͷ
  121. ͕࣌ؒ༨ͬͨΒ ࣗݾ঺հ

  122. Shinichi Maeshima ! " # @netwillnet @willnet http://blog.willnet.in Willnet Inc.

  123. 3BJMT%. ͨ͘͞Μొஃ͍ͯ͠·͢ • Rails Developers Meetup #1 • Rails Developers

    Meetup 2017 • Rails Developers Meetup 2018 Day2 • Rails Developers Meetup 2018 Day3 Extreme • Rails Developers Meetup 2019 ← New!
  124. ٕज़ސ໰ۀΛ͍ͯ͠·͢

  125. ͓࢓ࣄ4/4తͳ΋ͷΛ։ൃ ͍ͯ͠·͢

  126. 8F`SFOPUIJSJOH

  127. ސ໰ઌ΋ ืू͍ͯ͠·ͤΜ

  128. ͰԥΔ༻ҙͷ͋Δ ձࣾ͞Μ͸ྫ֎ͳͷͰ ͓੠͕͚͍ͩ͘͞

  129. )BQQZ5FTUJOH