AWS を使ったシステムのテスト方針 #jawsug #jawsug_niigataken #nds60

AWS を使ったシステムのテスト方針 #jawsug #jawsug_niigataken #nds60

第60回 長岡IT技術者勉強会資料

9a4cdd1e0e5d6c5de72c98dbfd3a7832?s=128

Kazumune Katagiri

June 22, 2019
Tweet

Transcript

  1. AWS Λ࢖ͬͨγεςϜͷςετํ਑ (αʔόαΠυ) 2019/6/22 @nemuzuka ୈ60ճ ௕ԬITٕज़ऀษڧձ

  2. ॳΊͯͷํ΋ͦ͏Ͱͳ͍ํ΋ • ยۅ Ұफ (͔ͨ͗Γ ͔ͣΉͶ) • id: nemuzuka /

    @nemuzuka • Java / Scala / Kotlin(࠷ۙ࢝Ίͨ) • ݸਓࣄۀओ • 95 % ͘Β͍ϦϞʔτ(௕Ԭ)ͰϫʔΫ
  3. ࠓ೔ͷษڧձͰ AWS ࢖ͬͨγεςϜ։ൃ͍ͨ͠ʂ ͱࢥͬͨํ΋ଟ͍ͱࢥ͍·͢

  4. ͱ͸͍͑ γεςϜ։ൃΛ͢Δ্Ͱ͸ ςετ͸ආ͚ͯ௨Ε·ͤΜ

  5. Unit Test ͷஈ֊Ͱ ϩʔΧϧ͔Β AWS ࢖͍·͔͢ʁ (࣮֬Ͱ͚͢Ͳ Slow Test ʹͳΓ΍͍͢Ͱ͢ΑͶ)

  6. ࠓճͷ͓୊ AWS Λ࢖ͬͨγεςϜͷ ςετํ਑

  7. ݴ༿ͷఆٛ • Unit Test (UT) • ର৅ͷΫϥε(ϝιου)ͷৼΔ෣͍ͷςετ • Integration Test

    (IT) • API ͷݺͼग़͠ͷৼΔ෣͍ͷςετ • System Test (ST) • ෳ਺ͷ API ͷݺͼग़͠΍ AWS ͷػೳΛ࢖ͬͯϢʔεέʔε͕ ຬ͍ͨͤͯΔ͔ͷςετ
  8. ͋ΔγεςϜͷߏ੒ ALB Fargate RDS SNS1 SQS1 SNS2 subscribe ը໘ଆͷ௨஌༻ Controller

    Service Repository EventPublisher MessagePolling Service EventPublisher Repository ఆظతʹ polling ExternalClient ֎෦αʔϏε
  9. ͊͞ɺςετ͍͖ͯ͠·͠ΐ͏ʂ

  10. Unit Test • ґଘ͢Δ class ͸ Mock Խ • e.g.

    Controller ͷςετͰ͸ Service ͸ Mock Խ͢Δ • Mock ࢖ͬͨՕॴ͸ݺΜͩ͜ͱ + Ҿ਺ͷ assert Λߦ͏ • Repository ࣮૷ͷςετ͸ H2 ౳࢖ͬͯɺSQL ͷςετΛߦ͏ • AWS / ֎෦αʔϏεΛҙࣝ͢ΔՕॴ͸ແཧʹςετ͠ͳ͍ • AWS ͷ SDK Λ࢖͏ՕॴΛہॴԽ͢Δ • EventPublisher / MessagePolling • Mock αʔόతͳ΋ͷΛཱͯͯ΋͍͍͚Ͳɺ࣮ػͰ֬ೝͨ͠ํ͕࣮֬ • AWS / ֎෦αʔϏεΛҙࣝ͢Δͷ͸ class ͷ࣮૷ଆ • ݺͼग़͠ݩ͸ interface ͚ͩ஌͍ͬͯΕ͹ྑ͍ • ֎෦αʔϏε͕ Test ϞʔυͰςετͰ͖ΔͳΒ΍ͬͨํ͕ྑ͍ Controller Service Repository EventPublisher MessagePolling ExternalClient ɹɹɹ : ςετΫϥεΛ࡞Δ୯Ґ DomainModel ValueObject
  11. Integration Test • جຊతʹ͸࣮ࡍͷ object Λ࢖͏ • Repository ͸ H2

    ͱ͔࢖͏ • ςετέʔεͷதͰ table ͷ assert ΋ߦ͏ • AWS / ֎෦αʔϏεΛҙࣝ͢ΔՕॴ͸ Mock Խ • ֎෦αʔϏε͕ Test ϞʔυͰςετͰ͖ΔͳΒ࣮ࡍ ͷ object Λ࢖ͬͯ௨৴ͯ͠΋ྑ͍ • γφϦΦͬΆ͘ API Λ૊Έ߹ΘͤͨςετέʔεΛ࡞ͬ ͯ΋ྑ͍ • Controller ݺͼग़͠ -> (SQS ͔ΒͷϝοηʔδΛऔͬ ͖ͯͨςΠͰ) Service ݺͼग़͠ Controller Service Repository EventPublisher MessagePolling Service EventPublisher Repository ExternalClient ɹɹɹ : ςετΫϥεΛ࡞Δ୯Ґ : ςετΫϥεͷ։࢝Ґஔ
  12. System Test • AWS ্ʹຊ൪ͱಉ͡ ߏ੒ͷ ST ؀ڥΛ࡞Δ • ST

    ؀ڥʹ Docker Image ΛσϓϩΠ • ST ؀ڥͷ API Λςε τΫϥε͔Βݺͼग़͢ ALB Fargate RDS SNS1 SQS1 SNS2 ֎෦αʔϏε
  13. ςετίʔυͷ؅ཧͱ࣮ߦλΠϛϯά • ςετίʔυ͸ϓϩμΫγϣϯίʔυ ͱҰॹͷϦϙδτϦͰ؅ཧ • feature branch Λ push ͨ࣌͠ʹ

    CircleCI ্Ͱςετ࣮ࢪ • merge ৚݅͸ϨϏϡʔͱ CircleCI ͷςετʹ pass ͢Δ͜ͱ • ςετʹ pass ͢Δͱ Docker Image ͕Ͱ͖Δ • System Test ༻ͷγφϦΦΛ؅ཧ͢ ΔϦϙδτϦΛ༻ҙ • Test Ϋϥε͚ͩͷϦϙδτϦ • System Test ؀ڥʹ Docker Image ΛσϓϩΠͯ͠ɺTest ࣮ߦ(CircleCI) • ຖ೔ఆظతʹ System Test Λ࣮ߦ ͠ɺςετ͕௨Δ͔Λ֬ೝ͢Δ Unit Test / Integration Test System Test
  14. ςετ͸όονϦʂ ʴ ۚͰ(Ϧιʔε૿ڧͯ͠)໰୊͸ શͯղܾͰ͖Δ ͱ͍͏༁Ͱ΋ͳ͍ͷͰɺ ࢖͏αʔϏεͷΫη΋ߟ͓͖͑ͯ·͠ΐ͏

  15. SQS • ෳ਺ճϝοηʔδ͕औΕΔ͜ͱ͕͋Δ / ॱং͕อূ͞Εͳ͍ • FIFO ΋͋Δ͚Ͳεϧʔϓοτ͕… • ॏෳΛආ͚ΔͷͰ͸ͳ͘ɺෳ਺ճϝοηʔδ͕औΕͯ΋େৎ෉

    ͳΑ͏ʹઃܭ͢Δ • e.g. ॲཧΛߦ͏લఏ৚݅Λຬͨ͞ͳ͍৔߹ɺࣺͯΔ • e.g. ॲཧதͷεςʔλεͷ৔߹ɺϦΫΤετΛड͚෇͚ͳ ͍
  16. RDS(ͱ͍͏͔ MySQL) • ద੾ʹ index షΖ͏ • Πϯελϯε͋͛ͯ΋ SSD Ͱ΋݅਺૿͑Δͱμϝͳ࣌͸μϝ

    • τϥϯβΫγϣϯ෼཭Ϩϕϧҙࣝ͠Α͏ • MySQL ͷ REPEATABLE READ Ͱߋ৽ॲཧͷεϧʔϓοτग़ͤΔͷ…͔ʁ • Oracle ͬΆ͘ MySQL ࢖͏ͱେମϠέυ͢Δ ಡΜͩ࣌ؒ͸ଛ͠ͳ͍ˠ
  17. SQS + RDS • SQS ͷ enqueue ͱ dequeue +

    ॲཧͷλΠϛ ϯάʹؾΛ͚ͭͯ • RDS ͷ commit લʹ enqueue ͯ͠͠· ͍ɺ dequeue ͨ͠ଆͷॲཧͰର৅ͷϨίʔ υ͕ͳ͍…ͱ͍͏͜ͱʹͳΒͳ͍Α͏ʹ
  18. ·ͱΊ • ςετ͸େࣄ͚ͩͲؤுΓ͗͢ͳ͍ • ݕূίʔυͱςετ͸ผɻUT / IT ͰԿͰ΋΍Ζ͏ͱ͠ͳ͍ํ͕ྑ͍ • ੹຿Λ෼͚Ε͹

    UT ΋͠΍͘͢ͳΔɻDI ࢖͑Δํ͕ςετ͠΍͍͢(assert ͕࢓ࠐΈ΍͍͢) • JVM ࢖͏ͳΒ SpringBoot + Kotlin ͕ࠓͷॴݸਓతʹੜ࢈ੑߴ͍ؾ͕͢Δ • AWS ࢖͏ͱָʹͳΔͱ͜Ζ͸ੵۃతʹ࢖͍͖ͬͯ·͠ΐ͏ʂ • ஌ͬͯΕ͹େৎ෉ͳ͜ͱ͕ଟ͍Ͱ͢ɻͨͩɺ؂ࢹͱܭଌ͸ॏཁ • ࣄલʹෛՙςετ͓ͯ͘͠ͱۚͰղܾͰ͖ͳ͍͜ͱʹؾ෇͖΍͍͢Ͱ͢ • όʔδϣϯͷԘ௮͚͸Ͱ͖ͳ͍ͷͰɺςετ͕ແ͍ͱόʔδϣϯ UP ͕͠ΜͲ͍Ͱ͢ • UI ଆ(εϚϑΥΞϓϦ / ϒϥ΢β)ͷࠓ࣌ͷςετͬͯͲ͏΍ͬͯΔͷ͔ඇৗʹؾʹͳΓ·͢ʂ