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

アジャイル開発とE2Eテストの話

 アジャイル開発とE2Eテストの話

532348a1aba5a909e283624c3d2a9a95?s=128

SHIFT_EVOLVE

July 01, 2021
Tweet

Transcript

  1. ΞδϟΠϧ։ൃͱ E2Eςετͷ࿩ 2021/06/25 DevOps & QAΤϯδχΞLTେձ Vol.1 Yyoshitomi

  2. ࣗݾ঺հ • גࣜձࣾτϦΫτϥοΫ • QA୲౰ • ৽ଔࡾ೥໨ • ٢෌ඦ߹ࡊ

  3. ฐࣾͷ։ൃମ੍ • ΞδϟΠϧ։ൃΛ࠾༻ • εϓϦϯτ͸2िؒ͝ͱ • CircleCIͳͲͷܧଓతσϓϩΠ • ຖ೔3ճͷE2Eςετͷఆظ࣮ߦ

  4. • ෼ࢄ୆ாʢϒϩοΫνΣʔϯʣܕαʔϏε • औҾࢀՃاۀɹ1ࣾ͝ͱʹ1ϊʔυʢαʔόʔʣཱ͕ͭ • औҾ͝ͱʹೝఆೝূہͷλΠϜελϯϓΛԡ͢ • ϑϨʔϜϫʔΫɿCordaɺSpringɺRails • ϑϩϯτΤϯυɿReact

    ݱϓϩδΣΫτʹ͍ͭͯ
  5. ςελʔ͔ΒݟͨݱϓϩδΣΫτͷݫ͍͠఺ • औҾʹؔ܎͢Δૢ࡞͕·ͣ஗͍ • ຖिಥવػೳ௥Ճ͕ੜ͑ͯ͘Δ • ը໘΍ϝʔϧͷจݴ͕ߴස౓ͰมΘΔ • UI΋ߴස౓Ͱมߋ͕ೖΔͷͰɺSPAͷߏ੒΋ෳࡶ •

    ॏ͍ ͱʹ͔͘ςετ͕௥͍͔ͭͳ͍
  6. E2EςετΛؤுΖ͏ͱࢥͬͨ • ܾ·ͬͨखॱͰςετͰ͖Δ • จݴͷมߋͷͨͼʹςετ͕མͪΔ͔Βݟམͱ͕͠ൃੜ͠ͳ͍ • ςελʔҎ֎ͷࢹ఺Ͱ΋ςετͰ͖Δ

  7. ͜͏ͨ͠໰୊Λ ղফͰ͖Δʂ ୯ମςετ΍Request specͰ΋Χόʔ Ͱ͖ͳ͍෦෼Λܾ·ͬͨखॱͰςετͰ͖Δ • ޡೖྗͳͲɺखಈͩͱੜ͡Δೖྗ಺༰΍ૢ࡞ͷ͹Β͖͕ͭൃੜ͠ͳ͍ • ΍΍͍͜͠ૢ࡞Λ໢ཏతʹ࣮ߦͰ͖Δ ೖྗཝʹʮ༗೉͏ʯͬͯ

    ೖྗ͢Δͭ΋Γ͕ ʮٜ஍ࠈʯͬͯೖྗͯ͠ ͠·ͬͨʂ ΋͏͔Ε͜Ε4ճ͘Β͍ ҧ͏ϘλϯΛΫϦοΫͯ͠ ςετ΍Γ௚ͯ͠Δʂ
  8. ςετΛ ϝϯςφϯε͠ͳ͕Β ϦϑΝΫλϦϯά΋ Ͱ͖Δʂ จݴͷมߋͷͨͼʹςετ͕མͪΔ͔Β ݟམͱ͕͠ൃੜ͠ͳ͍ • 1ͭͷ༻ޠ͕มߋʹͳΔͱը໘શମͷจݴ͕มߋʹͳΔ͜ͱ΋͠͹͠ ͹͕ͩɺe2eͳΒࣗಈతʹը໘্ͷจݴΛ֬ೝͯ͘͠ΕΔ ͜͜͸Α͘จݴ͕

    มΘΔ͔Βe2eͰ ֬ೝ͠Α͏ʂ
  9. ςελʔҎ֎ͷࢹ఺Ͱ΋ςετͰ͖Δ • ςετγφϦΦΛQAҎ֎ͷϓϩάϥϚʹϨϏϡʔͯ͠΋Β͑ΔͷͰ ςελʔҎ֎ͷࢹ఺Ͱ΋ςετͰ͖Δ ͜ͷςετ͸ ୯ମςετͰ੥͚ෛͬͯ ͜͜͸΋ͬͱ ςετέʔεΛ૿΍͠ ·͠ΐ͏ʂ ͳΔ΄Ͳʂ

  10. E2Eςετͷߏ੒ • Cucumber • Capybara • Selenium Chrome • CIͰͷςετ͸headlessϞʔυ

    • CircleCI
  11. • γφϦΦ • ࣗવݴޠͰॻ͚Δ • ೔ຊޠͰ લఏɾ΋͠ɾ͔ͭɾͳΒ͹ • Step •

    rubyͰ࣮૷ Cucumber
  12. ςετγφϦΦ γφϦΦ: Ϣʔβʔ͸ϝʔϧΞυϨεͱύεϫʔυ ͰγεςϜʹϩάΠϯͰ͖Δ લఏ ϩάΠϯը໘Λද͍ࣔͯ͠Δ ΋͠ ϝʔϧΞυϨεೖྗཝʹ"test@example.com"ͱೖྗ͢Δ ͔ͭ ύεϫʔυೖྗཝʹ"password"ͱೖྗ͢Δ

    ͔ͭ "ϩάΠϯ"ΛΫϦοΫ͢Δ ͳΒ͹ μογϡϘʔυΛද͍ࣔͯ͠Δ ͔ͭ ϔομʔࢯ໊ʹ"ࢁా Ֆࢠ"ͱදࣔ͞ΕΔ
  13. γφϦΦͷॻ͖ํ • ̍γφϦΦͰςετ͢Δ͜ͱ͸γϯϓϧʹ • ಉ͜͡ͱΛԿճ΋ςετ͠ͳ͍ • എܠ΍લఏͳͲΛ͏·͔ͭ͘͏ ௕͍ͱ୭΋ ಡΜͰ͘Εͳ͍ʂ

  14. γφϦΦͷ ॻ͖ํ γφϦΦΞ΢τϥΠϯ: ޡͬͨύεϫʔυ΍ϝʔϧΞυ ϨεͰ͸ϩάΠϯͰ͖ͳ͍ લఏ ϩάΠϯը໘Λද͍ࣔͯ͠Δ ΋͠ ϝʔϧΞυϨεೖྗཝʹ"<ϝʔϧΞυϨε>"ͱೖྗ͢Δ ͔ͭ

    ύεϫʔυೖྗཝʹ"<ύεϫʔυ>"ͱೖྗ͢Δ ͔ͭ "ϩάΠϯ"ΛΫϦοΫ͢Δ ͳΒ͹ "ϝʔϧΞυϨε·ͨ͸ύεϫʔυʹޡΓ͕͋Γ·͢ɻ࠶౓͝ೖྗ ͍ͩ͘͞ɻ"ͱදࣔ͞ΕΔ ྫ: | ϝʔϧΞυϨε | ύεϫʔυ | | test@example.com | passpass | | error@example.com | password | • ExampleʢྫʣΛ͏·͔ͭ͘͏ • ͨͩ͠ςʔϒϧ͕ڊେʹͳΓ ͗͢ͳ͍Α͏ʹ͢Δ • Scenario OutlineͰ΋ςετͨ͠ ͍͜ͱ͸̍γφϦΦͰͻͱͭʹ ߜΔ
  15. γφϦΦͷ ॻ͖ํ γφϦΦΞ΢τϥΠϯ: Ϣʔβʔ͸ඞਢ߲໨Λೖྗͯ͠೔هͷ৽ن࡞੒͕Ͱ͖Δ લఏ Ϣʔβʔ͸”<Ϣʔβʔ>"ͰϩάΠϯ͍ͯ͠Δ ͔ͭ ೔هͷ࡞੒ը໘Λද͍ࣔͯ͠Δ ͔ͭ ໊݅ʹ"<໊݅>"ͱೖྗ͢Δ

    ͔ͭ ຊจʹ"<ຊจ>"ͱೖྗ͢Δ ͔ͭ ը૾ʹ”<ϑΝΠϧ>"ΛΞοϓϩʔυ͢Δ ΋͠ "ৄࡉ߲໨ʢ೚ҙʣ"ͱදࣔ͞ΕΔ ͔ͭ ߦͬͨ৔ॴʹ”<৔ॴ>”ͱೖྗ͢Δ ͔ͭ ࢖༻ֹۚʹ”<ֹۚ>"ͱೖྗ͢Δ ͔ͭ "࡞੒"ΛΫϦοΫ͢Δ ͔ͭ "<ϝοηʔδ>"ͱදࣔ͞ΕΔ ͔ͭ ϝχϡʔ͔Β"<ϖʔδ>"ΛΫϦοΫ͢Δ ͳΒ͹ “<ϖʔδ>”ʹ”<໊݅>”ͱ”<දࣔ݁Ռ>" ྫ: ɹ | Ϣʔβʔ | ໊݅ | ຊจ | ϑΝΠϧ | ৔ॴ | ֹۚ | ϝοηʔδ | ϖʔδ | දࣔ݁Ռ | | Ϣʔβʔ1 | ɹ| | | | | ೖྗͯ͠Լ͍͞ | μογϡϘʔυ | දࣔ͞Εͳ͍ | | Ϣʔβʔ1 | ɹ| | | | | ೖྗͯ͠Լ͍͞ | ೔هҰཡ | දࣔ͞Εͳ͍ | | Ϣʔβʔ1 | ͍͋͏ | | | | | ೖྗͯ͠Լ͍͞ | μογϡϘʔυ | දࣔ͞Εͳ͍ | | Ϣʔβʔ2 | ɹ| | | | | ೖྗͯ͠Լ͍͞ | μογϡϘʔυ | දࣔ͞Εͳ͍ | | Ϣʔβʔ2 | ɹ| | | | | ೖྗͯ͠Լ͍͞ | ೔هҰཡ | දࣔ͞Εͳ͍ | | Ϣʔβʔ1 | ͍͋͏ | ͔͖͘ | | | | ೖྗͯ͠Լ͍͞ | μογϡϘʔυ | දࣔ͞Εͳ͍ | | Ϣʔβʔ1 | ͍͋͏ | ͔͖͘ | test.png | | | ೔هΛ࡞੒͠·ͨ͠ | μογϡϘʔυ | දࣔ͞ΕΔ | | Ϣʔβʔ1 | ͍͋͏ | ͔͖͘ | test.png | | | ೔هΛ࡞੒͠·ͨ͠ | ೔هҰཡ | දࣔ͞ΕΔ | | Ϣʔβʔ1 | ͍͋͏ | ͔͖͘ | test.jpeg | | | ೔هΛ࡞੒͠·ͨ͠ | μογϡϘʔυ | දࣔ͞ΕΔ | | Ϣʔβʔ1 | ͍͋͏ | ͔͖͘ | test.jpeg | | | ೔هΛ࡞੒͠·ͨ͠ | ೔هҰཡ | දࣔ͞ΕΔ | • γφϦΦλΠτϧͱ಺༰͸߹͍ͬͯΔ͔ʁ • ಉ͡ૢ࡞Λϖϧιφͷ਺͚ͩ֬ೝ͢Δҙຯ͸͋ Δͷ͔? • γφϦΦΞ΢τϥΠϯʹཔΓ͗ͯ͢҉߸ͷΑ͏ ͳγφϦΦʹͳ͍ͬͯͳ͍͔? • ͦͷςετ͸ຖճࣗಈͰ࣮ߦ͢Δඞཁ͸͋Δͷ ͔? • ςετέʔεͷਫ਼ࠪΛͤͣɺطଘͷγφϦΦΛ ίϐϖͯ͠গ͠ม͚͑ͨͩʹͳ͍ͬͯͳ͍͔ʁ • ςετ͕ಈ͚͹ྑ͍ͱࢥ͍ͬͯͳ͍͔ʁ • ԿͷͨΊͷςετͳͷ͔ʁ
  16. Stepͷॻ͖ํ • ؾΛ͚ͭΔ͜ͱ • Ϋϥε΍XPath͸ͳΔ΂͘࢖Θͳ͍ ὎ E2Eςετʹϝϯςφϯε͸͖ͭ΋ͷ͕ͩɺ ɹ ΫϥεͳͲ͸SPAͷมߋʹΑͬͯมΘͬͯ͠·͏͜ͱ΋͋ΔͷͰɺ ϝϯςφϯεස౓Λ཈͑ΔͨΊʹ΋࢖༻͢Δlocator͸ߟྀ͢Δ

  17. Stepͷॻ͖ํ • ςετ͍ͨ͠จݴ͸ϕλॻ͖͢Δ • i18nͳͲͰߏ଄Խ͠ͳ͍ when ‘ OKϘλϯΛΫϦοΫ͢Δ’ find(‘<“data-test=“submit-button”>’).click end

    t(‘test_string’) ͳͲ͸ආ͚Δ
  18. Stepͷॻ͖ํ MPDBUPSͱςΩετΛࢦఆͯ͠จݴΛ౎౓֬ೝ͢Δ when ‘ OKϘλϯΛΫϦοΫ͢Δ’ find(‘<“data-test=“submit-button”>’, text: “OK”).click end

  19. Stepͷॻ͖ํ ςετͷ໨త͸ ʮػೳ΍UI͕࢓༷௨Γʹͳ͍ͬͯΔ͜ͱΛ อূ͢ΔͨΊʯͰ͋Δ͜ͱΛ๨Εͳ͍Α͏ʹ͍ͨ͠ ςετͷ໨త͕ʮϝϯςφϯεΛ͠ͳ͍Α͏ʹςετΛճ͢͜ͱʯʹ ͳͬͯ͠·͏ͱҙຯ͕ແ͍

  20. ͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ