Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

͜͏ͨ͠໰୊Λ ղফͰ͖Δʂ ୯ମςετ΍Request specͰ΋Χόʔ Ͱ͖ͳ͍෦෼Λܾ·ͬͨखॱͰςετͰ͖Δ • ޡೖྗͳͲɺखಈͩͱੜ͡Δೖྗ಺༰΍ૢ࡞ͷ͹Β͖͕ͭൃੜ͠ͳ͍ • ΍΍͍͜͠ૢ࡞Λ໢ཏతʹ࣮ߦͰ͖Δ ೖྗཝʹʮ༗೉͏ʯͬͯ ೖྗ͢Δͭ΋Γ͕ ʮٜ஍ࠈʯͬͯೖྗͯ͠ ͠·ͬͨʂ ΋͏͔Ε͜Ε4ճ͘Β͍ ҧ͏ϘλϯΛΫϦοΫͯ͠ ςετ΍Γ௚ͯ͠Δʂ

Slide 8

Slide 8 text

ςετΛ ϝϯςφϯε͠ͳ͕Β ϦϑΝΫλϦϯά΋ Ͱ͖Δʂ จݴͷมߋͷͨͼʹςετ͕མͪΔ͔Β ݟམͱ͕͠ൃੜ͠ͳ͍ • 1ͭͷ༻ޠ͕มߋʹͳΔͱը໘શମͷจݴ͕มߋʹͳΔ͜ͱ΋͠͹͠ ͹͕ͩɺe2eͳΒࣗಈతʹը໘্ͷจݴΛ֬ೝͯ͘͠ΕΔ ͜͜͸Α͘จݴ͕ มΘΔ͔Βe2eͰ ֬ೝ͠Α͏ʂ

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

• γφϦΦ • ࣗવݴޠͰॻ͚Δ • ೔ຊޠͰ લఏɾ΋͠ɾ͔ͭɾͳΒ͹ • Step • rubyͰ࣮૷ Cucumber

Slide 12

Slide 12 text

ςετγφϦΦ γφϦΦ: Ϣʔβʔ͸ϝʔϧΞυϨεͱύεϫʔυ ͰγεςϜʹϩάΠϯͰ͖Δ લఏ ϩάΠϯը໘Λද͍ࣔͯ͠Δ ΋͠ ϝʔϧΞυϨεೖྗཝʹ"[email protected]"ͱೖྗ͢Δ ͔ͭ ύεϫʔυೖྗཝʹ"password"ͱೖྗ͢Δ ͔ͭ "ϩάΠϯ"ΛΫϦοΫ͢Δ ͳΒ͹ μογϡϘʔυΛද͍ࣔͯ͠Δ ͔ͭ ϔομʔࢯ໊ʹ"ࢁా Ֆࢠ"ͱදࣔ͞ΕΔ

Slide 13

Slide 13 text

γφϦΦͷॻ͖ํ • ̍γφϦΦͰςετ͢Δ͜ͱ͸γϯϓϧʹ • ಉ͜͡ͱΛԿճ΋ςετ͠ͳ͍ • എܠ΍લఏͳͲΛ͏·͔ͭ͘͏ ௕͍ͱ୭΋ ಡΜͰ͘Εͳ͍ʂ

Slide 14

Slide 14 text

γφϦΦͷ ॻ͖ํ γφϦΦΞ΢τϥΠϯ: ޡͬͨύεϫʔυ΍ϝʔϧΞυ ϨεͰ͸ϩάΠϯͰ͖ͳ͍ લఏ ϩάΠϯը໘Λද͍ࣔͯ͠Δ ΋͠ ϝʔϧΞυϨεೖྗཝʹ"<ϝʔϧΞυϨε>"ͱೖྗ͢Δ ͔ͭ ύεϫʔυೖྗཝʹ"<ύεϫʔυ>"ͱೖྗ͢Δ ͔ͭ "ϩάΠϯ"ΛΫϦοΫ͢Δ ͳΒ͹ "ϝʔϧΞυϨε·ͨ͸ύεϫʔυʹޡΓ͕͋Γ·͢ɻ࠶౓͝ೖྗ ͍ͩ͘͞ɻ"ͱදࣔ͞ΕΔ ྫ: | ϝʔϧΞυϨε | ύεϫʔυ | | [email protected] | passpass | | [email protected] | password | • ExampleʢྫʣΛ͏·͔ͭ͘͏ • ͨͩ͠ςʔϒϧ͕ڊେʹͳΓ ͗͢ͳ͍Α͏ʹ͢Δ • Scenario OutlineͰ΋ςετͨ͠ ͍͜ͱ͸̍γφϦΦͰͻͱͭʹ ߜΔ

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

Stepͷॻ͖ํ • ؾΛ͚ͭΔ͜ͱ • Ϋϥε΍XPath͸ͳΔ΂͘࢖Θͳ͍ ὎ E2Eςετʹϝϯςφϯε͸͖ͭ΋ͷ͕ͩɺ ɹ ΫϥεͳͲ͸SPAͷมߋʹΑͬͯมΘͬͯ͠·͏͜ͱ΋͋ΔͷͰɺ ϝϯςφϯεස౓Λ཈͑ΔͨΊʹ΋࢖༻͢Δlocator͸ߟྀ͢Δ

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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