Ruby && Webํ໘͔Βݟ͑ͨ ΤϯυπʔΤϯυςετͷ ྺ࢙ͱࢥ͍ग़ॾڮګհ @moro
View Slide
‣ (ࣸਅ)ղফͰ͖ͨෆ҆
Kyosuke MOROHASHImoro moro
લ࢙
‣ ΞϓϦέʔγϣϯͷܗΛ࡞Δͱςετڥ͕͍ͭͯ͘Δɻ‣ test/models, test/controllers, test/views …‣ ʮ୯ମʯςετ͕த৺Ruby on Rails
‣ & rspec_rails‣ spec/models, spec/controllers, ….RSpec
‣ ϞσϧɾϏϡʔɾίϯτϩʔϥΛ౷߹(integrate)ͯ͠ ςετ͢Δɻ‣ ୯ҰϦΫΤετʹ͓͍ͯɺΞϓϦέʔγϣϯͷ֤ϨΠϠ͕ҙਤ௨Γ౷߹ͯ͠ಈ͔͘ɺΛςετ͢Δɻ‣ ෳϦΫΤετʹΘͨΔڍಈ(͋ͷը໘͔Β͜ͷը໘ʹભҠͯͦ͠ΕΛೖྗ…)ςετͰ͖ͳ͍ɻIntegration test / Request spec
‣ ϒϥβૢ࡞ΛࣗಈԽͯ͠ςετ͢Δ Selenium ͱɺ‣ ਓؒͷૢ࡞Λهͯ͠ςετέʔεΛ࡞ͬͯ͘ΕΔSelenium IDESelenium & Selenium IDE
‣ ϓϩδΣΫτϝϯόʔ͕ɺຖே࠷৽ͷίʔυΛνΣοΫΞτͯ͠Ұ௨Γ৮ͬͯΈΔɻԿ͔͋Ε͙͢ʹ͢ɻखಈͰͷܧଓతE2Eςετ
ෳϦΫΤετʹ·͕ͨΔɺϢʔβʔ͕࣮ࡍʹ͏ γφϦΦʹԊͬͨςετΑͦ͞͏ɻ ͜ͷ࣌Ͱ·ͩखಈςετɺ࣮ߦ͢Δͷ͕େมɻ Selenium IDEͰهͨ͠ςετ͙͢յΕΔɻ࣮ײͰ͖ͨ͜ͱ
Webrat +Cucumber
‣ ΤϯυπʔΤϯυςετΛɺࣗવݴޠͰ͔͚Δɻ‣ MVCϨΠϠ௨؏ & ෳΞΫγϣϯ‣ ࣗવݴޠͰςετ͕͔͚Δɻ‣ Gherkin ϑΥʔϚοτ‣ Given, When, Then / લఏɺ͠ɺͳΒCucumber
‣ Cucumber ͷόοΫΤϯυɺWebΞϓϦΛςετ͢ΔͨΊͷϥΠϒϥϦɻ‣ ηογϣϯ(cookie)ΛҾ͖ͭ͛Δ‣ ʮෳϦΫΤετΛॱ൪ʹݺΜͩʯςετ͕͔͚ΔΑ͏ʹ‣ ϦϯΫϑΥʔϜΛૢ࡞͢Δ(ͭΓͰ͑Δ)API͕͋ͬͨWebrat
‣ ࣗવݴޠͰॻ͍ͨ *.feature Λಈ͔ͨ͢ΊͷΈΛstep_definitions ͱͯ͠ॻ͘ɻ‣ step_definitions ͷதRubyίʔυɻࣗવݴޠͱ ਖ਼نදݱͰϚονϯά͞ΕΔɻCucumber + Webrat
‣ Gherkin ςΩετΛϓϩάϥϚͱɺϓϩάϥϚͰͳ͍ਓͱɺڞ༗Ͱ͖ͳ͍͔ͨΊͨ͠ɻ‣ ϏδωεαΠυͷ༷ݕ౼/߹ҙʹ‣ ݟੵΓ୯ҐʹͬͯΈͨΓ‣ νʔϜͷ৽ϝϯόʔͷઆ໌ʹ‣ ։ൃ࣌ͷҙࣝ߹Θͤʹ (feature͚ͩॻ͍ͨੜࣽ͑PRΛϨϏϡʔͨ͠Γ)ࢲͱCucumber
Web ͷɺγφϦΦهड़Ͱ͖ΔE2EࣗಈςετͷΈΓͪΐ͏ΜΓɻ ޠͰॻ͍ͯ͋ΔͷɺͬͯΈΔͱΘ͔Γ͍͢ɻ ૿͕͑ͨʮຊޠϓϩάϥϛϯάʯʹͳͬͯ͠·͏ͱ ϓϩάϥϚʹͱͬͯࡶͳ͚ͩɻ࣮ײͰ͖ͨ͜ͱ
“࣮ࡍʹɺͦΕΒඇٕज़ܥͷεςʔΫϗϧμʔ ʢརؔऀʣͱҰॹʹςετΛॻ͘ͱ͍͏ɺ ՍۭͷॴͰ͔͠ʹཱͪ·ͤΜɻhttps://martinfowler.com/bliki/DynamicTyping.html ( http://bliki-ja.github.io/DynamicTyping/ )
‣ ඞͣ͠ʮॻ͍ͯʯΒΘͳ͚ΕͳΒͳ͍Θ͚Ͱͳ͍ɻ‣ ಉ͡දݱͰεςʔΫϗϧμʔ͕Έͳڞ௨ཧղ͢Δͷ͕େࣄɻ‣ ʮεςʔΫϗϧμʔʯʹͪΖΜɺ։ൃνʔϜؚ·ΕΔɻ‣ ͦͷͨΊͷݴޠޠኮΛҭͯΔͷ͕େͩͬͨɻ Α͘ݴΘΕ·͢ɺɺɺ͚ͩͲ
Capybara
‣ WebratޓAPIͷ͋ΔɺͳϥΠϒϥϦ‣ υϥΠόΛΓସ͑ͯJavaScriptಈ͔ͤΔΑ͏ʹɻ‣ SeleniumߴϨϕϧAPIͰ͑ΔΑ͏ʹͳͬͨɻCapybaraϕϯϦɺͰ͢ΑͶ
JavaScript ·ͰؚΉΤϯυπʔΤϯυςετ ͏ͷ͍͢͝خ͍͠ɻ Capybara APIࣗମͲΜͲΜศརʹͳ͍ͬͯΔɻ JS͕ಈ͘֎෦ϒϥβΛىಈ͢Δͷɺศར͚ͩͲ͍&Τϥʔ͕Θ͔ΓͮΒ͘ͳͬͨɻ࣮ײͰ͖ͨ͜ͱ
‣ RailsϒʔϜͱͱʹਓؾ্ঢɺߴػೳԽ͕ਐΉɻ‣ shared example, subject, let, ϞοΫඪ४ఏڙ ‣ RSpec 3ͰAPIͱ(งғؾ)͕มΘΔɻ‣ test-unit power-assert ͷख़ͱͱʹɺxunitͷݟ͕͠ਐΉɻಉ࣌ظʹ(ྑ͘ѱ͘)RSpecʹେ͖ͳมԽ͕
Capybara + Xseason 1
‣ Turnip‣ RSpecͷϥϯλΠϜͰɺGherkinελΠϧͷςετΛ ࣮ߦͰ͖Δɻ‣ CukeͷࡶϙΠϯτͩͬͨɺstep definitionsఆٛͱͷ ϚονϯάΛվળ͍ͯ͠Δɻ+ RSpec + Gherkin
‣ feature spec‣ Capybara APIΛͬͯɺΤϯυπʔΤϯυςετΛॻ͚ΔΑ͏ʹͨ͠ɻ‣ Ұ෦ͷޠኮ(feature, scenario…)Λಋೖ͕ͨ͠ɺ͋͘·ͰRSpecͷϝιου໊ΤΠϦΞεʹͱͲ·Δɻ‣ 2017࣌ͩͱɺ͜Ε͕ଟ͔ͳɻ+ RSpec - Gherkin
‣ σʔλͷηοτΞοϓ͕ͭΒ͍ɻ‣ Τϯυ͔ΒผͷΤϯυ·ͰɺେͳΦϒδΣΫτάϥϑ͕ඞཁͱͳΓ͕ͪɻ‣ ͕͔͔࣌ؒͬͨΓɺҙਤͤ͵ෆશσʔλ͕Ͱ͖ͨΓɻ‣ Έ߹Θͤͷςετ͕ͭΒ͍ɻ‣ shared exampleΛۦͨ݁͠Ռɺݟ௨͕͠ѱ݅͘ଟ͘ͳΔɻfeature spec ͭΒ͍ܥ ͋Δ͋Δ
JavaScript ·ͰؚΉΤϯυπʔΤϯυςετ ͏ͷ͍͢͝خ͍͠ (΄Μ͜Ε) Α͍ΤϯυπʔΤϯυςετΛॻ͘ͷ͍͠ɻ υϝΠϯʹԊͬͨޠኮΛҭͯΔͷɻ ݕূ͖݁͢ՌͷݟۃΊ(ͳΜͱͳ͘Ξαʔτ)ɻ࣮ײͰ͖ͨ͜ͱ
https://speakerdeck.com/akiinyo/du-miyasuiendotuendotesutogashu-kitai?slide=5
શϨΠϠΛ·ͱΊςετ͢Δʹศར ͚ͩͲɺେ͖͍ͯ͘ςετʹͳΓ͕ͪ݁Ռͱͯ͠:
Capybara + Xseason 2
‣ Appium‣ Web͚ͩͰͳ͘ϞόΠϧΞϓϦࣗಈςετՄೳʹɻ‣ Rails 5.1+ ͰCapybara͕ඪ४ʹɻ‣ SystemTestCaseͱͯ͑͠ΔΑ͏ʹͳΓɺRSpecͰSystem Specͱͯ͠αϙʔτɻ‣ Selenium υϥΠόͰheadless chrome͑ΔΑ͏ʹɻ͜Ε͔ΒͷΤϯυπʔΤϯυςετ
·ͱΊ
‣ ࣗಈԽ͞Εͨ‣ ΤϯυπʔΤϯυͷςετ‣ ͱͯΑ͍ͷ࣮ͩײͰ͖ͨՁ
‣ ΤϯυπʔΤϯυςετ‣ େ͖ͯ͘‣ ͯ͘‣ ॻ͘/ϝϯς͢Δͷ͕ΊΜͲ͍͘͞ɺςετʹͳΓ͕ͪͬͨ՝
“ࣗಈςετΛॻ͘ϓϥΫςΟεੈͷதʹཱʹ͖ࠜɺࣗͨͪͰࣗಈςετΛॻ͘ͷ͕ʮ;ͭ͏ʯͳੈͷதʹͳΓ·ͨ͠ɻ͜Εେ͖ͳલਐͰ͢ɻ— テスト駆動開発 「付録C」
‣ ͷલͷϑΟʔνϟΛͲ͏͍͏γφϦΦʹͰ͖Δ͔ɺ ͦͷγφϦΦͰͷςετରԿ͔ɺΛΑ͘ߟ͑Δɻ‣ ύϥϝλϥΠζυςετ(γφϦΦΞτϥΠϯ)ɺ ͏ͪΐͬͱٕज़తʹ͏·͘Εͦ͏ͳؾ͢Δɻ‣ υϝΠϯνʔϜʹ߹ͬͨޠኮΛҭ͍ͯͯ͘ɻͬͨ՝ͱ͖߹͑Δͱ͍͍Ͱ͢ΑͶ
“ςετۦಈ։ൃɺϓϩάϥϛϯάதͷෆ҆Λίϯτϩʔϧ͢Δख๏ͩɻ ུ ʮ͜ΕࠔͳͳͷͰɺ࠷ॳ͔Βͯ͢Λݟ௨ͤΔΘ͚Ͱͳ͍ʯͱ͍͏ਅͬͳײ֮ͷ͜ͱͩɻ— テスト駆動開発 「まえがき」
‣ ʮϑΟʔνϟશମʯͪΖΜ࠷ॳ͔Βݟͤͳ͍ɻ‣ ͰϑΟʔνϟͷࠜຊΛͪͬͪΌ͘࡞ͬͯɺͦͷςετΛ௨͠ଓ͚Δ͜ͱͰ͖ͦ͏ɻ‣ ࠜຊԿ͔ɺߟ͑Δɻ‣ νʔϜͷޠኮ͕ҭ͍ͬͯΕɺ͍ͬͦ͏εϜʔζʹͳΓͦ͏ɻʮΤϯυπʔΤϯυʯͷద༻