Golang API Testing the HARD way

Golang API Testing the HARD way

Presentations at GoConference 2018 Autumn.

5bfed9aa3a9ebccb0c0f0cb65ee9e012?s=128

Seiji Takahashi

November 25, 2018
Tweet

Transcript

  1. API TESTING THE HARD WAY @__timakin__ Go CONFERENCE 2018 Autumn

  2. SEIJI TAKAHASHI timakin @__timakin__ __timakin__ ॴଐɿ(VOPTZ*ODϝσ ΟΞࣄۀຊ෦ ݴޠɿ(P 4XJGU +BWB4DSJQU

  3. ΞδΣϯμ w (Pͷ"1*ͷςετʹ͓͚ΔςελϏϦςΟ w ςετʹؔ͢Δ5JQT w Ϣχοτςετʹ͍ͭͯ w ΠϯςάϨʔγϣϯςετʹ͍ͭͯ w

    ϥΠϒϥϦબఆɺͭ·͍ͮͨՕॴ
  4. None
  5. (Pͷςετϊ΢ϋ΢ w Ϣχοτςετͷޮ཰Խ w (Pͷ༏Εͨඪ४ػೳ

  6. (Pͷςετϊ΢ϋ΢ w Ϣχοτςετͷޮ཰Խ w (Pͷ༏Εͨඪ४ػೳ w .PDL w JOUFSGBDFʹΑΔந৅Խ

  7. (Pͷςετϊ΢ϋ΢ w Ϣχοτςετͷޮ཰Խ w (Pͷ༏Εͨඪ४ػೳ w .PDL w JOUFSGBDFʹΑΔந৅Խ w

    5FTUJOHGSBNFXPSLT
  8. (Pͷςετϊ΢ϋ΢ w Ϣχοτςετͷޮ཰Խ w (Pͷ༏Εͨඪ४ػೳ w .PDL w JOUFSGBDFʹΑΔந৅Խ w

    5FTUJOHGSBNFXPSLT w OFUIUUQIUUQUFTUͷ࢖͍ํ
  9. ςετͷ࣮ྫ ʢಛʹΠϯςάϨʔγϣϯςετʣ ͷྫ͕Կނ͔ෆ଍͍ͯ͠Δʜ

  10. (PͰςετ͢Δ৔߹ͷجຊ w JOUFSGBDFͷ׆༻ w AQBDLBHFYYY@UFTUAͱ͍͏໋໊ w 5BCMF%SJWFO5FTU w 5FTU$BDIF $PWFSBHF

    #FODINBSL
  11. *OUFSGBDFΛ׆༻ͯ͠ΔͱԿ͕͍͍ͷ͔ʁ w ผͷϨΠϠʔͷ࣮૷Λ஌ΒͣʹίʔυΛॻ͖ਐΊΒ ΕΔ w ࣮૷ͷ੾Γସ͕͑༰қʹߦ͑Δ w NPDLੜ੒ʹ࢖͑Δ w αϯϓϧϨεϙϯεͷ࡞੒౳͕೉͍͠


    ֎෦"1*ݺͼग़͠ͳͲͰ໾ʹཱͭ
  12. AQBDLBHFYYY@UFTUA w 5FTU1BDLBHFΛ࣮૷ͱ෼཭͢Δ w ࣮ࡍͷݺͼग़͠ํͱܗࣜΛ߹ΘͤΔ w QSJWBUFͳม਺ʹର͢Δࢀর͕Ͱ͖ͳ͍Α͏ʹ͢Δ

  13. 5BCMF%SJWFO5FTU

  14. 5BCMF%SJWFO5FTU w ςετର৅ͱͳΔσʔλ഑ྻɺ
 ظ଴͞ΕΔ݁Ռͷ഑ྻΛΠςϨʔτ͢Δ͜ͱͰ
 ෳ਺ͷςετέʔεΛ؆ܿʹ·ͱΊΒΕΔɻ w ϕϯνϚʔΫΛ෼͚ͨΓɺU1BSBMMFMΛ࢖͍͍ͨ৔߹ ͸4VCUFTUT΋ݕ౼͢Δɻ

  15. 5FTU$BDIF $PWFSBHF #FODINBSL w 5FTU$BDIF
 ςετؔ਺͝ͱʹ*%͕ৼΒΕͯɺ
 ݁Ռ͕ϑΝΠϧʹు͖ग़͞Εͯอଘ͞ΕΔɻ
 Ұக͢Δ݁Ռ͕͋Ε͹࢖͍ճ͢ɻ w $PWFSBHF

    #FODINBSL
 ඪ४Ͱαϙʔτ͞ΕΔ
 ΧόϨοδϨϙʔτͷग़ྗɺϕϯνϚʔΫ
  16. $BDIFʹ͍ͭͯ͸ʜ IUUQTTQFBLFSEFDLDPNUJNBLJOIPXHPDBDIFUFTUT

  17. (PͰςελϏϦςΟʔΛ্͛Δʹ͸ w ͦ΋ͦ΋ςετ͕͠ʹ͍͘ίʔυ͸μ ϝ w JOUFSGBDFͰϞοΫՄೳͳ෦ҐΛ૿΍͢ w ςετϔϧύʔͷॆ࣮ w ϢχοτςετʹدͤΒΕΔͱ͜Ζ͸


    పఈͯ͠دͤΔׂͱେࣄ
  18. (PͰςελϏϦςΟʔΛ্͛Δʹ͸ w ϢχοτςετͷͨΊͷඪ४ػೳ͕
 ௒ॆ࣮͍ͯ͠ΔͷͰɺͦΕΛ׆༻͢ΔͨΊʹ΋ɺ
 Ͱ͖ΔݶΓߏ଄ମͷςετύοέʔδʹ
 ϩδοΫΛूதͤ͞Δɻ w 4FSWJDF૚ʹϑΟϧλϦϯάͷϩδοΫΛ࢒ͨ͠Γ ͠ͳ͍ɻ

  19. ͜͜·Ͱ͕લఏ

  20. Ϣχοτςετͷ࿩

  21. Ϣχοτςετͷ5JQT w 5FTU)FMQFS w 4UVCTUBOEBSEQBDLBHFT w 'JYUVSFT w 5FTUJOHGSBNFXPSLT

  22. 5FTU)FMQFS U)FMQFS ΛݺͿ͜ͱͰɺ
 )FMQFSͷؔ਺ΛςετΛ
 ϚʔΫͯ͠ɺGBJMͨ࣌͠ʹ
 ݺͼग़͠ՕॴΛQSJOUͯ͘͠ΕΔɻ ͜ΕΛݺ͹ͳ͍ͱ಺෦ͰGBJM͠ ͨΓɺॲཧΛڞ௨Խͨ࣌͠ʹਏ ͍ࢥ͍Λ͢Δɻ

  23. 5FTU)FMQFS ඪ४ύοέʔδͷςετ͸ಛʹ)FMQFS͕׆༻͞Ε͍ͯΔ ʢSVO DPQZ'JMF OFX5FNQ%JSʣ

  24. 4UVCTUBOEBSEQBDLBHFT w UJNFύοέʔδɺSBOEύοέʔδͳͲͷ݁ՌΛ࢖͏ ॲཧ͸TUVC͢Δඞཁ͕͋Δ

  25. ελϒํ๏ w άϩʔόϧม਺ͷࠩ͠ସ͑ w ελϒՄೳͳϥούʔ w αʔυύʔςΟύοέʔδͷར༻

  26. άϩʔόϧม਺ͷࠩ͠ସ͑ άϩʔόϧͳม਺ͰมΘΓ͏Δ݁ՌΛऔಘ͢ ΔΑ͏ʹ͠ɺςετ࣌͸ͦΕΛॻ͖׵͑Δɻ ಉ͡஋ͳΒͱ΋͔͘ɺQBSBMMFMͰ΍ͬͨ࣌ʹෆ ͕҆͋Δɻ HPSN͕΍ͬͯΔʜ IUUQTHJUIVCDPNKJO[IVHPSNCMPCNBTUFSVUJMTHP-

  27. ελϒՄೳͳϥούʔ ελϒ༻ͷ஋͕ηοτ͞Εͯ
 ͍ͨΒఆ਺తʹ஋Λฦؔ͢਺Λ
 ఆٛ͢Δɻ

  28. αʔυύʔςΟύοέʔδͷར༻ w ࣌ࠁݻఆ w HJUIVCDPNCFOCKPIOTPODMPDL w HJUIVCDPNULVDIJLJGBLFUJNF w DPEFDMPVEGPVOESZPSHDMPDL

  29. 4UVCTUBOEBSEQBDLBHFT w ʮ༗ޮظݶΛա͗ͨΒΤϯςΟςΟΛແޮԽ͢Δʯ
 Έ͍ͨͳॲཧ͕͋Δ৔߹ɺ࣌ࠁΛ୯७ʹݻఆ͢Δͩ ͚Ͱ͸ͳ͘ਐΊΔඞཁ͕͋Δ w ͦ͏ͨ͠৔߹͸αʔυύʔςΟͷύοέʔδ΋ߟ ྀʹೖΕΔ͕ɺʢ͍ͩͿ࣮૷͕গͳ͍ͷͰʣ
 جຊతʹؔ਺Ͱϥοϓ͢Ε͹ࣄ଍ΓΔͱࢥΘΕΔɻ

  30. 'JYUVSFT w ςετσʔλͷఆٛํ๏ w ߏ଄ମ w ഑ྻͷσʔλߏ଄ʢ5BCMF%SJWFO5FTUʣ w ͦͷଞ w

    +40/ :".-
  31. 'JYUVSFT w ߏ଄ମ w ϙΠϯλΛड͚औͬͯૢ࡞͢Δؔ਺Λςετ͢Δ ৔߹ɺςετ༻ͷม਺ͷݩσʔλ͕มΘΓଓ͚ͯɺ ҙਤ͠ͳ͍ڍಈ͕ى͜Δɻ w 5BCMF%SJWFO5FTUͷΑ͏ʹݸผͷέʔεͰࢀর͢ Δσʔλ͕ҧ͏৔߹͸0,

  32. 'JYUVSFT w +40/ :".- w JPVUJM3FBE'JMFͯ͠ςετσʔλΛಡΈࠐΉ w ಡΈࠐΈ༻ͷσʔλ͸JOQVU ·ͨ͸TSD 


    ൺֱ༻ͷσʔλ͸HPMEFO w "1*ͷϦΫΤετͱϨεϙϯεΛ
 શ෦+40/ఆ͓͍ٛͯͯ͠ςετ͢Δͷ΋͋Γ

  33. 'JYUVSFT w JOQVUHPMEFO w ඪ४ύοέʔδͰͷར༻Օॴ w ςετΧόϨοδϖʔδͷ಺༰ݕূ w (PEPDੜ੒಺༰ݕূ

  34. 'JYUVSFT w JOQVUHPMEFO w ඪ४ύοέʔδͰͷར༻Օॴ w ςετΧόϨοδϖʔδͷ಺༰ݕূ w (PEPDੜ੒಺༰ݕূ w

    ࣮ࡍͷར༻ྫ w "1*ͷϦΫΤετͱϨεϙϯεΛ
 શ෦+40/ఆ͓͍ٛͯͯ͠ςετ͢Δ w εςʔλείʔυ͚ͩνΣοΫ͢ΔΑ͏ͳ৔߹͸ɺ
 ϦΫΤετ͚ͩA TSDAͱ͍͏Α͏ͳ໋໊Ͱఆٛ͢Δͷ΋͋Γ
  35. 5FTUJOHGSBNFXPSLT w ʮ(Pͬͯɺ\\೚ҙͷݴޠ໊^^Ͱ͍͏ͱ͜Ζ\\ͦͷݴޠͷ୅දత ͳςετϑϨʔϜϫʔΫ໊^^ͬͯͳΜ͔ͳ͍ΜͰ͔͢ʁʯ w "1*ϑϨʔϜϫʔΫͰ΋ಉٞ͡࿦͕͋Δͱࢥ͍·͕͢ʜ

  36. 5FTUJOHGSBNFXPSLT w ʮ(Pͬͯɺ\\೚ҙͷݴޠ໊^^Ͱ͍͏ͱ͜Ζ\\ͦͷݴޠͷ୅දత ͳςετϑϨʔϜϫʔΫ໊^^ͬͯͳΜ͔ͳ͍ΜͰ͔͢ʁʯ w "1*ϑϨʔϜϫʔΫͰ΋ಉٞ͡࿦͕͋Δͱࢥ͍·͕͢ʜ w ςετϑϨʔϜϫʔΫͷੋඇ w ଞͷਓ͕ແݶʹޠ͍ͬͯΔͷͰলུ

    w ʮͨͩͷ%4-ʯ w ʮίϯςΩετʹ͋ͬͨϝοηʔδදࣔʯ w ʮUFTUJOHͰඞཁे෼ʯ w ʮϝϯςอূʯ w ʮπʔϧؒͷ࿈ܞͷऔΓ΍͢͞ʯ
  37. 5FTUJOHGSBNFXPSLT w ͜Ε͘Β͍ͳΒೖΕͯ΋Α͘ͳ͍ʁͱ͍͏ύοέʔδ w HJUIVCDPNHPPHMFHPDNQ w HJUIVCDPNTUSFUDISUFTUJGZ w 5BCMF%SJWFO5FTUͰͪΌΜͱςετέʔε໊ॻ͍͓͚ͯ͹
 ࠔΔ͜ͱ΋গͳ͍ͷͰผʹ͍Βͳ͍͔΋

  38. 5FTUJOHGSBNFXPSLT w ͜Ε͘Β͍ͳΒೖΕͯ΋Α͘ͳ͍ʁͱ͍͏ύοέʔδ w HJUIVCDPNHPPHMFHPDNQ w HJUIVCDPNTUSFUDISUFTUJGZ w 5BCMF%SJWFO5FTUͰͪΌΜͱςετέʔε໊ॻ͍͓͚ͯ͹
 ࠔΔ͜ͱ΋গͳ͍ͷͰผʹ͍Βͳ͍͔΋

    w ݸਓతʹೖΕͳ͍ύοέʔδ w ඞཁे෼ͳ͸ͣͷUFTUJOHύοέʔδͷϥούʔ w HPUFTUUPPMT w (P$POWFZ w (PCMJO
  39. ΠϯςάϨʔγϣϯςετͷ࿩

  40. ΠϯςάϨʔγϣϯςετʹඞཁͳ͜ͱ w ࣮ߦ؀ڥ w %# DBDIF w 'JYUVSF w ࣌ࠁɾཚ਺ݻఆ

    w DPOUFYU಺ม਺ w ֎෦"1*ͷ.PDL w "1*SFRSFTͷݕূ
  41. ࣮ߦ؀ڥͷߏங w %#ɺDBDIFΛͲͷΑ͏ʹཱͯΔ͔ w .PDL͢Δ w σʔϞϯ࣮ߦ w EPDLFSίϯςφΛཱͯΔ

  42. %#पΓͰඞཁͳ࡞ۀ w ςετ࣮ߦ͝ͱʹҎԼͷϑϩʔΛ౿Ή  ίωΫγϣϯཱ֬  ςʔϒϧ࡞੒  Ϛελσʔλద༻ 

    ςετ࣮ߦ  ςʔϒϧഁغ  ίωΫγϣϯ੾அ
  43. %#Λ.PDL͢Δͷ͸ྑ͍͔ʁ w ͋·ΓϕλʔͰ͸ͳ͍ͱࢥ͏ w 42-จ͕ؒҧ͍ͬͯΔ͔Ͳ͏͔͸ίϯύΠϧ࣌ʹ ؾ͚ͮͳ͍ w αʔυύʔςΟ"1*ͳΒ·ͩ͠΋ɺ%#ͳΒࣗ෼Ͱ ؀ڥ͕༻ҙͯ͠ɺҙਤ௨Γ͔Ͳ͏͔ͷݕূ͕ Ͱ͖Δͷ͔ͩΒɺ.PDL͠ͳ͍ํ͕ྑ͍

  44. σʔϞϯ࣮ߦ w HJUIVCDPNMFTUSSBUHPUFTUNZTRME w Կ΋ߟ͑ͳͯ͘΋NZTRME͕࣮ߦͰ͖Δ

  45. ίϯςφ w (PͰ%PDLFSʹ઀ଓ͢Δϥούʔ w HJUIVCDPNGTPV[BHPEPDLFSDMJFOU w HJUIVCDPNPSZEPDLFSUFTU w ςετͷͨΊʹ.Z42-΍3FEJT઀ଓ͕Ͱ͖Δ
 ྗڧ͍ϥούʔ

    w ࣗલͰEPDLFSίϯςφͨͯΔ࣌ʹඞཁͳ
 ىಈ֬ೝऔΕΔ·Ͱͷ1JOHͳͲΛ΍ͬͯ͘ΕΔ
  46. ίϯςφ

  47. γϯϓϧͳ઀ଓ %#ͷίωΫγϣϯͳͲɺ DMPTFͷॲཧ͕ඞཁͳ΋ ͷ͸ɺ UFBSEPXO༻ͷGVODΛฦ ٫͓͍ͯͯ͠ɺ ࢀর͍ͯ͠Δؔ਺಺Ͱ EFGFSͰ࣮ߦ͢Δͱ
 ҆શɻ

  48. 'JYUVSF w ϢχοτςετͱҟͳΓ༻్͕͍͔ͭ͋͘Δ w SFRSFTݕূ༻ͷQBZMPBE w ࣄલʹ%#ʹೖΕ͓ͯͨ͘Ίͷσʔλ w ڞ௨ͷϚελσʔλ w

    ݸผͷςετ༻ʹ༻ҙ͞Εͨσʔλ
  49. SFRSFTݕূ༻ͷQBZMPBE w JOQVUHPMEFOͰQBZMPBEΛ+40/ʹ·ͱΊ͓ͯ͘ w ΫΤϦύϥϝʔλʔ΋ඞཁͳΒ੾Γग़͓ͯ͘͠

  50. ςʔϒϧ࡞੒ɾ࡟আ w ςʔϒϧఆ͕ٛ͹Βͭ͘ͱ໘౗ͳͷͰɺ
 HJUIVCDPNLLVCVOTRMEFGΛ࢖ͬͯ
 ҰݸͷεΩʔϚʹ࠷৽ͷঢ়ଶΛ·ͱΊ͓ͯ͘ͱศར

  51. ςʔϒϧ࡞੒ɾ࡟আ

  52. None
  53. Ϛελσʔλςετ͝ͱͷσʔλ w ݸਓతʹ͸ҎԼͷΑ͏ʹɺϚελσʔλͱͦΕҎ֎ Λ෼͚͍ͯΔ w UFTUEBUBpYUVSFTEFGBVMU w Ϛελσʔλ w UFTUEBUBpYUVSFTPQUJPOBM

    w ςετέʔεʹΑͬͯࢀরͨ͠Γ͠ͳ͔ͬͨΓ͢ Δσʔλ
  54. σʔλ࡞੒

  55. σʔλ࡞੒

  56. ಛघͳσʔλૠೖ w .Z42- 1PTHSF42-ͳͲͷσʔλૠೖ͸ָ w ("&Λ࢖ͬͯΔͱ%BUBTUPSFʹ
 'JYUVSFΛೖΕͨ͘ͳΔ

  57. None
  58. ETNPDL w 'JYUVSFͷ:".-ఆٛΛࢦఆ͢Ε͹ɺࢦఆͷ,JOEͷ σʔλΛྲྀ͠ࠐΊΔ w $MFBOVQ࡞ۀ͸ผ్ඞཁ

  59. ࣌ࠁɾཚ਺ݻఆ w ௨ৗͷςετͱಉ༷ɻϞοΫ༻ͷؔ਺Λఆٛͯ͠ɺ Ϧηοτ༻ͷؔ਺ΛSFUVSOͯ͠΋ྑ͍ɻ

  60. $POUFYU಺ม਺ w DPOUFYU಺෦ͷ஋Λ࢖ͬͯॲཧ͢Δ৔߹ɺUFTU༻ͷDPOUFYUʹ஋ ΛೖΕ͓ͯ͘ඞཁ͕͋Δ w ଟ෼օ͞Μ͕಺෦Ͱఆ͍ٛͯ͠Δ/FX$POUFYU8JUI999ͳϝ ιουΛݺͿͷ΋ྑ͍͕ɺͪΌΜͱϦΫΤετͱͯ͠
 ݕূ͢ΔͳΒͤΊͯSFRʹ஋Λૠೖ͓͖͍ͯͨ͠ɻ

  61. ֎෦"1*ͷ.PDL w ֎෦"1*͸΋͏Ͳ͏͠Α͏΋ͳ͍ͷͰ.PDL͢Δ w NPDLೖΕͯΔͷʹ࢖ͬͯͳ͍ͱΤϥʔͰऴྃ͢Δ ͷͰɺNPDL͚ͩ͸ॲཧΛڞ௨Խͤͣ ɺݸผͷςε τέʔεͰૠೖ͢Δɻ

  62. .PDLͷίϯτϩʔϥʔੜ੒

  63. .PDLར༻

  64. "1*SFRSFTͷݕূ w HPMBOHHP΍BQQFOHJOFͷެࣜύοέʔδʹ౓ʑ
 AUSZAͱ͍͏ϥούʔ͕͋Δɻ w ϦΫΤετݕূ΍ςετͷग़ྗ݁ՌͳͲͷݕূ͸
 AUSZAͱ͍͏ஆ͔͍ؔ਺͕΍ͬͯ͘Εͯͯɺ
 ඇৗʹ࣮૷ͷࢀߟʹͳΔ

  65. SFRSFTΛݕূ͢Δ৔߹ʜ

  66. None
  67. None
  68. ؆ૉ☺

  69. ͓·͚

  70. 5FTU3VOOFSࣗମͷϥούʔ w ΠϯςάϨʔγϣϯςετͰ΍Δ͜ͱ͸
 ͍͍ܾͩͨ·ͬͯΔ w UFTUJOH.Λड͚औΔؔ਺Ͱϥοϓͯ͋͛͠Δͱ
 εοΩϦ͢Δ

  71. None
  72. ·ͱΊ w ۃྗ"1*ͷςετ͸ϢχοτςετͰϩδοΫΛ୲อͰ͖ΔΑ ͏ʹɺ࣮૷Λߏ଄ମۙ͘ʹدͤΔ w ΠϯςάϨʔγϣϯςετͷϊ΢ϋ΢͸·ͩ·ͩΦʔϓϯ͡Ό ͳ͍͚Ͳɺެࣜύοέʔδͷஆ͔͍ςετ͕ඇৗʹࢀߟʹͳΔ w γϯϓϧ͞ΛอͪͭͭɺͲ͜·Ͱڞ௨ԽͰ͖Δ͔͕୉ޣຯͳͷ ͰɺͦΕΛָ͠Έ·͠ΐ͏

  73. ͋Γ͕ͱ͏͍͟͝·ͨ͠ʂ