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

CI/CDがあたりまえの今の時代にAPIテスティングツールに求められていること / CI/CD Test Night #7

CI/CDがあたりまえの今の時代にAPIテスティングツールに求められていること / CI/CD Test Night #7

Ken’ichiro Oyama

March 26, 2024
Tweet

More Decks by Ken’ichiro Oyama

Other Decks in Technology

Transcript

  1. 5

  2. • runn ( means "Run N". is pronounced /rʌ́n én/.

    ) is a package/tool for running operations following a scenario. • https://github.com/k1LoW/runn • γφϦΦΛYAMLͰॻ͍ͯͦΕΛ΋ͱʹૢ࡞ʢΦϖϨʔγϣϯʣΛࣗಈԽͰ͖Δύοέʔδ/πʔϧ • ίϚϯυͱͯ͠΋GoͷύοέʔδʢϥΠϒϥϦʣͱͯ͠΋࢖͑Δ • APIςετ΋ϢʔεέʔεͷϑΝʔετϓϥΠΦϦςΟͱͯ͠Ґஔ෇͚͍ͯΔ • ϝΠϯͰ։ൃ͍ͯ͠Δͷ͸ @k1LoW ɹɹɹͱ @k2tzumi ɹɹɹ ͷ2ਓ • ͦΕͧΕrunnΛυοΫϑʔσΟϯά͍ͯͯ͠ɺ@k1LoW͕Goύοέʔδͱͯ͠ͷrunnɺ@k2tzumi ͕ίϚϯυͱͯ͠ͷrunnΛओʹ࢖͍ͬͯΔ 6 https://github.com/k1LoW/runn runnʢϥϯΤψʣ
  3. • 1όΠφϦͷγφϦΦ࣮ߦͷCLIίϚϯυʢπʔϧʣͱͯ͠࢖༻Ͱ͖Δ • 1όΠφϦ = CIϑϨϯυϦ • ͞·͟·ͳϓϩτίϧʹରԠ͓ͯ͠Γɺ1ͭͷγφϦΦ಺Ͱෳ਺૊Έ߹ΘͤΔ͜ͱ͕Մೳ • HTTP

    • gRPC • DatabaseʢSQLʣ • Chrome DevTools Protocol • ೚ҙίϚϯυͷ࣮ߦʢϩʔΧϧ/SSHʣ • GoͷTest Helperʢύοέʔδʣͱͯ͠࢖༻Ͱ͖Δ 18 https://github.com/k1LoW/runn runnͷػೳʢv0.101.1ʣʢ1/3ʣ
  4. 19 https://github.com/k1LoW/runn runnͷػೳʢv0.101.1ʣʢ2/3ʣ • γφϦΦϑΝΠϧʢYAMLʣͷϑΥʔϚοτ͕OpenAPI SpecϥΠΫ • γφϦΦ಺ͷεςοϓؒͷ஋͕ࣗಈͰ࿈ܞ͞Ε͍ͯΔ • ʮεςοϓAΛ࣮ߦ͔ͯ͠Βͦͷ݁ՌΛ࢖ͬͯεςοϓBΛ࣮ߦ͢Δʯͱ͍͏γφϦΦΛߏங͠΍͍͢

    • ෳ਺ͷγφϦΦͷ࣮ߦΛ૝ఆ࣮ͨ͠૷ • ෳ਺ͷγφϦΦͷ෼ׂ࣮ߦɺαϯϓϦϯά࣮ߦɺϥϯμϜ࣮ߦͳͲ͕Մೳ • ϧʔϓ࣮ߦ΍ϦτϥΠ࣮ߦͷ࢓૊Έ͕૊ΈࠐΈͰඋΘ͍ͬͯΔ • ಉ͡γφϦΦϑΝΠϧΛ࢖ͬͨෛՙςετʢϩʔυςετʣ͕Մೳ • ίϚϯυΛ runn run ͔Β runn loadt ʹมߋ͢Δ͚ͩɻෳ਺γφϦΦ࣮ߦ΋ͦͷ··Մೳ • γφϦΦ࣮ߦͷϩά΋ه࿥Մೳ • γφϦΦ࣮ߦͷϓϩϑΝΠϧ΋औಘՄೳʢ֤εςοϓͷܦա࣌ؒʣ
  5. 20 https://github.com/k1LoW/runn runnͷػೳʢv0.101.1ʣʢ3/3ʣ • εςοϓ࣮ߦ͕Մೳʢ ——attach ʣɻGDBϥΠΫͳػೳ෇͖ɻ • ͍ΘΏΔϥϯϒοΫʢΦϖϨʔγϣϯ࣮ߦʣͷεςοϓ࣮ߦ΍σόοάʹศར •

    ΧελϜϥϯφʔ • طଘϥϯφʔΛ࢖ͬͯ৽͍͠ϥϯφʔΛߏஙՄೳɻ • εςοϓͷγϯλοΫεʢॻ͖ํʣΛมߋͨ͠ΓɺσϑΥϧτ஋ͷઃఆͳͲʹศར
  6. 28 Chaining RequestsʹରԠ͍ͯ͠Δ Chaining Requests • ʮ/path/to/A ʹϦΫΤετͨ݁͠ՌΛ࢖ͬͯɺ࣍ͷ /path/to/B ʹϦΫΤετ͢Δʯͱ͍͏

    Α͏ʹෳ਺ͷϦΫΤετͰ੒ΓཱͭςετγφϦΦ • APIύε୯ҐͰAPIςετΛ͢Δͷ͸࣮͸࣮૷ίετ͕͔͔Δ • ೝূτʔΫϯ͕ඞཁͳAPIύεͳͲɺલఏΛ࡞Δඞཁ͕͋ΔAPIύε͕গͳ͔Βͣ͋ΔͨΊ • ςετର৅ͷ֎͔ΒલఏΛ࡞Δͷ͸಺͔Β࡞ΔΑΓ೉͍͠ • Chaining RequestsͳςετγφϦΦΛ࡞ΕΔͳΒʮೝূτʔΫϯͷ֫ಘ͔Β։࢝͢ΔγφϦ ΦʯʹͰ͖Δ
  7. 29 Chaining RequestsʹରԠ͍ͯ͠Δ runnͷ৔߹ • ֤ϥϯφʔͷϨεϙϯεσʔλ͸ࣗಈͰه࿥͞ΕࢀরͰ͖ΔΑ͏ʹͳ͍ͬͯΔ • Ϩεϙϯε … HTTPϨεϙϯεɺgRPCϨεϙϯεɺσʔλϕʔεΫΤϦͷϨεϙϯεɺඪ

    ४ग़ྗ/ඪ४Τϥʔ/ऴྃίʔυ • ಛʹԿ͔هड़͢Δඞཁ͸ͳ͍ • current. ΍ previous. ΍ step[*]. ΍ step.<key>. ͰࢀরͰ͖Δ • ΋ͱ΋ͱChaining RequestsΛҙࣝͯ͠։ൃΛ։࢝ͨ͠ܦҢ͕͋Δ
  8. 31 ਌࿨ੑͷߴ͍ςετμϒϧ؀ڥ͕͋Δ ςετμϒϧ؀ڥ • APIςεςΟϯάπʔϧ͕ඞཁͳϨϕϧͷαʔϏε͸ن໛͕େ͖͘ͳΔʢؾ͕͢Δʣ • ྫ͑͹APIΛ࣋ͭΞϓϦέʔγϣϯͱσʔλϕʔε͚ͩͰ׬݁͢Δ͜ͱ͸͋·Γͳ͍ʢؾ͕ ͢Δʣ • A

    -> B -> C ͱ͍͏APIͷ࿈ܞΛ͢ΔαʔϏε͕͋ͬͨ৔߹ɺB -> CͷAPIςετ͸APIςεςΟϯ άπʔϧͰ࣮ݱͰ͖Δ͕ɺA -> BͷAPIςετΛ࣮ݱ͢ΔͨΊʹ͸CͷαʔϏεͷςετμϒϧ͕ ඞཁʹͳΔ • ςετμϒϧ؀ڥ͸APIςεςΟϯάπʔϧͱಉ༷ʹςετର৅ͷΞϓϦέʔγϣϯͷ֎Ͱߏங Ͱ͖Δ͜ͱ͕๬·͍͠ • ͜͜Ͱ΋ςετର৅ͷ֎͔ΒલఏΛ࡞Δͷ͸಺͔Β࡞ΔΑΓ೉͍͜͠ͱ͕Өڹ͍ͯ͠Δ
  9. 32 ਌࿨ੑͷߴ͍ςετμϒϧ؀ڥ͕͋Δ runnͷ৔߹ • ͳ͍… • গͳ͘ͱ΋runnͷػೳͱͯ͠͸༻ҙ͍ͯ͠ͳ͍ • ྫ͑͹ɺAPIϓϥοτϑΥʔϜͰ͋ΔPostmanͳͲ͸ελϒαʔόͷαϙʔτ͕͋Δ •

    ϖύϘͰ͸Ͳ͏͍ͯ͠Δ͔ͱ͍͏ͱrunnΛGoͷςετϔϧύʔͱͯ͠ىಈͯ͠ར༻͓ͯ͠Γɺಉ࣌ ʹ https://github.com/k1LoW/httpstub ΍ https://github.com/k1LoW/grpcstub ͳͲͰελϒαʔόΛ ཱ͍ͯͯΔ • ৄ͘͠͸Go Conference 2023Ͱͷൃදࢿྉ • https://speakerdeck.com/k1low/go-conference-2023 •
  10. 34 ςετέʔεʹID͕͋Δ ID • ID=ࣝผࢠ • શͯͷςετέʔεͷத͔Β1ͭͷςετέʔεΛҰҙʹಛఆͰ͖Δࣝผࢠ • େ఍ͷϓϩάϥϛϯάݴޠͷςεςΟϯάπʔϧʹ͸͋Δ •

    Namespace + Function name • ҟͳΔϓϥοτϑΥʔϜʹ͓͍ͯ΋ҰҙʹಛఆͰ͖Δඞཁ͕͋Δ • CI؀ڥͰ֬ೝͨ͠ID͸ϩʔΧϧʹ͓͍ͯ΋ಉ͡IDͰ͋Δ͜ͱ • ࣮͸౰ॳrunnʹ͸IDͱݺ΂Δ΋ͷ͸ͳ͔ͬͨ
  11. 35 ςετέʔεʹID͕͋Δ ͳͥID͕ඞཁͳͷ͔ • ࣮ߦίετͷେ͖͞ʹର߅͢ΔͨΊ • ʮ͢΂ͯΛຖճ࣮ߦ͢Δͷ͸ίετ͕େ͖͍ʯͱ͍͏ࢹ఺ • ςετ͕ࣦഊͨ͠ͱ͖ɺશͯΛ࣮ߦ͢Δͱ࣮ߦίετ͕େ͖͍ͨΊࣦഊͨ͠ςετ͚ͩΛ࣮ߦ͠ ͯݕূ͍ͨ͠

    … IDΛࢦఆ࣮ͨ͠ߦ • ࣮ߦ͕࣌ؒ௕͍ςετΛಛఆ͍ͨ͠ … IDͱϝτϦΫεͷ࿈ܞ • Αࣦ͘ഊ͢Δςετ͔Βॱʹ࣮ߦͯ͠ɺࣦഊ͢ΔͳΒૣΊʹ݁ՌΛಘ͍ͨ … IDΛࢦఆͨ͠ॱ൪ Ͱͷ࣮ߦ • IDΛ࢖ͬͨॊೈͳ࣮ߦͰର߅͢Δ
  12. 36 ςετέʔεʹID͕͋Δ runnͷ৔߹ • IDΛಈతʹੜ੒͍ͯ͠Δ • ʢϢχοτςετͱൺ΂ͯʣγφϦΦ͝ͱʹIDΛࢦఆ͢Δͷ͕໘౗ʹͳΔͱ൑அ • खݩͷ։ൃ؀ڥͰ΋CI؀ڥͰ΋ҰҙʹID͕ੜ੒Ͱ͖Δඞཁ͕͋Δ •

    ؀ڥ͕ҧ͏ͱγφϦΦϑΝΠϧͷઈରύε͸ҧ͏ • runnͷ࣮ߦσΟϨΫτϦ΋ҧ͏͜ͱ͕͋Δ • runn path/to/*.yml ΍ runs ../path/to/*.yml • γφϦΦͷ಺༰Λमਖ਼ͯ͠΋ಉ͡IDͰ͋Δඞཁ͕͋Δ
  13. 37 ςετέʔεʹID͕͋Δ Generate IDs using an array of absolute paths

    in reverse order. 1. ·ͣશͯͷγφϦΦςετͷઈରύεΛऔಘ 2. ͦΕͧΕύεͰ෼ׂ͠഑ྻʹ͢Δʢϧʔτύε͕ઌ಄ɺϑΝΠϧ໊͕຤ඌʣ 3. ഑ྻΛٯॱʹฒͼସ͑Δʢϧʔτύε͕຤ඌɺϑΝΠϧ໊͕ઌ಄ʣ 4. ͦΕͧΕͷ഑ྻͷN൪໨·ͰΛऔΓ݁߹ͯ͠จࣈྻʹ͢ΔɻશͯͷςετͰҰҙͷจࣈྻʹͳΕ͹ ͦΕͰऴྃɻҰҙʹͳΒͳ͚Ε͹N+1൪໨·Ͱऔಘ͢Δ 5. ҰҙʹͳͬͨจࣈྻΛϋογϡԽ͢Δ • GitͷίϛοτϋογϡͷΑ͏ʹલํҰகͰࢦఆՄೳʹ͍ͯ͠Δ • Design doc • https://github.com/k1LoW/runn/blob/main/docs/designs/id.md
  14. 39 APIεΩʔϚͱͷ࿈ܞ͕͋Δ APIͷI=ΠϯλʔϑΣΠε • APIςετ͸ʮAPIͷI=ΠϯλʔϑΣΠεʯͱ͍͏ڥքʢ͔Βʣͷςετ • APIͷςετέʔεࣗମ͕͋Δఔ౓ਖ਼͍͜͠ͱΛ֬ೝ͢Δखஈͱͯ͠APIεΩʔϚͱͷ࿈ܞ͕͋Δ • OpenAPIͷDocumentɺProtocol BuffersͷఆٛϑΝΠϧʢ.protoϑΝΠϧʣͳͲ

    • ʮAPIεΩʔϚʹ߹க͍ͯ͠Δ͔Ͳ͏͔ʯΛҰछͷܖ໿ςετͱͯ͠࢖༻͢Δ • ϦΫΤετ͕APIεΩʔϚʹ߹க͍ͯ͠ͳ͚Ε͹Τϥʔɺͱಉ࣌ʹϨεϙϯε͕APIεΩʔϚʹ߹ க͍ͯ͠ͳ͚Ε͹Τϥʔ • APIεΩʔϚͱ͍͏ܖ໿ͷҧ൓Λݕग़
  15. 40 APIεΩʔϚͱͷ࿈ܞ͕͋Δ runnͷ৔߹ • ֤ϥϯφʔʹAPIεΩʔϚΛࢦఆ͢Δ͜ͱͰ࿈ܞͰ͖Δ • OpenAPI Spec v3ͱProtocol Buffers

    v2/v3 ʹରԠ • ςετதͷશͯͷϦΫΤετ/ϨεϙϯεΛ֬ೝ͠APIεΩʔϚͱ߹க͠ͳ͚Ε͹ଈΤϥʔʹ͢Δ
  16. 42 ϙʔλϏϦςΟ͕͋Δ ϙʔλϏϦςΟ • ʮՄൖੑʯʮҠ২ੑʯ • ʮ࠶ར༻ੑʯ΋ • ·ͣ։ൃ؀ڥͱCI؀ڥͰಉҰͷ؀ڥʹͳΔΑ͏ʹ͠΍͍͢ঢ়ଶͳ͜ͱ͕๬·͍͠ •

    CIϑϨϯυϦ • ͞Βʹ࣮૷ίετ͕େ͖͍APIςετͷγφϦΦΛ༗ޮ׆༻͢Δ͜ͱͰඅ༻ରޮՌΛ͍͋͛ͨ • ෛՙࢼݧͱͯ͠ • ຊ൪؀ڥ΁ͷ֎ܗ؂ࢹɾܭଌͱͯ͠ • APIૢ࡞ͷϥϯϒοΫͱͯ͠
  17. 43 ϙʔλϏϦςΟ͕͋Δ runnͷ৔߹ • ෛՙςετػೳ • runn run Λ runn

    loadt ʹίϚϯυΛมߋ͢Δ͜ͱͰςετγφϦΦΛͦͷ··ෛՙςετʹ͢Δ͜ͱ͕Մೳ • ؀ڥม਺ల։ػೳ • ֤γφϦΦʹ͓͍ͯ؀ڥม਺ͷల։ʹରԠ͍ͯ͠ΔʢσϑΥϧτ஋ͷઃఆ΋Մೳʣ • ໊લղܾػೳ • curl ——resolveʹ૬౰͢ΔػೳΛ֤ϥϯφʔ͕͍࣋ͬͯΔ • ϖύϘͰ͸ϓϩΩγαʔόͷςετʹ࢖͍ͬͯΔ • ϦϞʔτγφϦΦ࣮ߦػೳ • http:// ΍ github:// ɺ gist:// ͱ͍ͬͨεΩʔϚʹରԠ͠ϦϞʔτϑΝΠϧΛγφϦΦͱ࣮ͯ͠ߦͰ͖Δ • Faker • ͍ΘΏΔμϛʔσʔλੜ੒ث • ຖճσʔλετΞͷ஋Λ៉ྷʹ͢Δඞཁ͕͋ΔΑ͏ͳϙʔλϏϦςΟͷ໘Ͱෆར • ྫɿݻఆͷςετϝʔϧΞυϨεͩͱຊ൪؀ڥͰαΠϯΞοϓςετ͕Ͱ͖ͳ͍ • ʮຖճσʔλετΞΛ៉ྷʹ͢Δʯඞཁ͕ͳ͍ͱϙʔλϏϦςΟ͚ͩͰͳ࣮͘ߦίετͷ໘ͰϝϦοτ͕͋Δ
  18. 45 ͓ΘΓʹ ͓ΘΓʹ • APIςεςΟϯάπʔϧ͸Ϣχοτςετͷπʔϧ΍E2EςεςΟϯάπʔϧΑΓ΋ɺ։ൃ؀ڥ Ͱ΋ຊ൪؀ڥͰ΋࢖ΘΕΔ͜ͱ͕ଟ͍ • APIςετͷଟ͕͘ϛσΟΞϜςετҎ্Ͱ͋Δ͜ͱ͔Β࣮૷ίετ΍࣮ߦίετ͕εϞʔϧς ετΑΓ΋େ͖͍ɻͦͷ෼ޮՌΛ࠷େʹ͍ͨ͠ͱ͍͏ཁٻ͕͋Δ •

    ʮ࣮ߦ࣌ͷίϯϐϡʔςΟϯάϦιʔείετ͸ͦ͜·ͰؾʹͳΒͳ͍͕ɺ࣮ߦ࣌ؒ΍࣮ ૷ίετ͸ͳΜͱ͔͍ͨ͠ʯͱͳΓ͕ͪ • ࠓճ঺հͨ͠ʮAPIςεςΟϯάπʔϧʹٻΊΒΕ͍ͯΔ͜ͱʯ͔Βબఆ΍ൃలͷͨΊͷؾ͖ͮ Λಘͯ΋Β͑ͨΒ޾͍Ͱ͢ɻ
  19. 47 PR • by @k2tzumi • https://qiita.com/advent-calendar/2023/runn- tutorial • APIγφϦΦςετπʔϧͰ΋͋Δ

    runn ͷ࢖ ͍ํΛεςοϓόΠεςοϓͰཧղ͍ͯ͘͠ νϡʔτϦΞϧ runn։ൃऀʹΑΔrunnνϡʔτϦΞϧ