Slide 1

Slide 1 text

Ӭ໺ Ұഅ 2019೥౓ ৽ଔೖࣾ גࣜձࣾλοϓϧ
 iOS ΤϯδχΞ / SRE νʔϜ @kazumanagano @kazuma_nagano

Slide 2

Slide 2 text

Ӭ໺ Ұഅ 2019೥౓ ৽ଔೖࣾ גࣜձࣾλοϓϧ
 iOS ΤϯδχΞ / SRE νʔϜ @kazumanagano @kazuma_nagano

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

tapple ޷͖ͳ͜ͱ͔Β࿀ͷ૬खΛݟ͚ͭΔϚονϯάΞϓϦ ࢀߟจݙɿhttps://tapple.me •ຖ݄10,000ਓͷΧοϓϧ͕஀ੜ
 •΍Γ͍ͨ͜ͱ΍ߦ͖͍ͨ৔ॴ͔Β ૬खͱͭͳ͕Δ •1,000छҎ্ͷσʔτϓϥϯ͔Β
 24࣌ؒҎ಺ʹσʔτ૬खΛ୳ͤΔ

Slide 5

Slide 5 text

E2E Test ࢀߟจݙɿhttps://autify.com/ja/news/for-mobile-launch

Slide 6

Slide 6 text

E2E(End to End) Testͱ͸ ࢀߟจݙɿhttps://autify.com/ja/news/for-mobile-launch ●ΞϓϦέʔγϣϯΛશͯ݁߹ͨ͠ঢ়ଶͰɺϨΠϠʔͷ ॳΊ͔ΒऴΘΓ·ͰʢEnd to Endʣςετ͢Δ͜ͱ ●Autify, MagicPodͱ͍ͬͨςετࣗಈԽSaaS͕ొ৔ ●खಈͰςετέʔεΛ֬ೝ͢Δ͜ͱΛE2Eςετͱݺ Ϳ͜ͱ΋͋Δ͕ɺʮϚχϡΞϧςετʯͱͯ۠͠ผ͠ ·͢

Slide 7

Slide 7 text

E2Eςετͷ໾ཱͭέʔεͬͯʁ

Slide 8

Slide 8 text

●ϚχϡΞϧςετΛ׬શʹࣗಈԽͰ͖Δʁ ●ਓ͕΍ΔΑΓਖ਼֬ʹςετͰ͖ͦ͏ʁ ●UnitTest΍ଞͷςετͷ੹຿͕ݮΔʁ ●ςελʔνʔϜͰ΋ӡ༻Ͱ͖Δʁ λοϓϧͷE2EͷୈҰҹ৅ ΄ͱΜͲ͕ؒҧ͍

Slide 9

Slide 9 text

ࠓճͷΰʔϧ ϞόΠϧʹ͓͚ΔE2Eςετͷਖ਼֬ͳ஌ࣝΛ
 ਎ʹ্͚ͭͨͰɺ໾ཱͭ΋ͷͩͱ஌ͬͯ΋Β͏ 1.E2Eςετͷ໾ׂ 2.λοϓϧʹ͓͚ΔE2Eςετͷಋೖ 3.·ͱΊ ֓ཁ

Slide 10

Slide 10 text

1. E2Eςετͷ໾ׂ

Slide 11

Slide 11 text

●ϚχϡΞϧςετΛ׬શʹࣗಈԽͰ͖Δʁ ●ਓ͕΍ΔΑΓਖ਼֬ʹςετͰ͖ͦ͏ʁ ●UnitTest΍ଞͷςετͷ੹຿͕ݮΔʁ ●ςελʔνʔϜͰ΋ӡ༻Ͱ͖Δʁ λοϓϧͷE2EͷୈҰҹ৅

Slide 12

Slide 12 text

ϚχϡΞϧςετͱͷҧ͍ VS

Slide 13

Slide 13 text

ϚχϡΞϧςετͱͷൺֱ ϚχϡΞϧςετ E2Eςετ Ձ֨ ϦʔυλΠϜ ಋೖ޻਺ ϝϯςίετ ߴ ௕ খ ௿ ௿ ୹ େ ߴ

Slide 14

Slide 14 text

ϚχϡΞϧςετͱͷൺֱ ●͢Ͱʹಋೖ͞ΕͯΔνʔϜ͕ଟ͍ ●ॊೈੑ͕͋ΓյΕͣΒ͘ɺमਖ਼΋ίϛϡέʔγϣϯͷΈ ●࣮ߦʹ͔͔Δۚમɺ࣌ؒίετ͕ߴ͍
 
 ●ಋೖ࣌ͷςετέʔε࡞੒ʹ޻਺͕͔͔Δ ●εΫγϣ΍ཁૉͷ༗ແΛ֬ೝ͢ΔͨΊյΕ΍͍͢ ●मਖ਼͸Webίϯιʔϧ্ͷγϛϡϨʔλʔΛૢ࡞ ●1αΠΫϧͷ࣮ߦίετ͕௿͍ͷͰߴස౓Ͱ࣮ߦՄೳ ϚχϡΞϧςετ E2Eςετ

Slide 15

Slide 15 text

ِཅੑͷൺֱ ●ςετ୺຤ґଘͷෆ۩߹
 ex) Ҏલͷςετͷঢ়ଶ͕࢒͍ͬͯΔͱ࠶ݱ͢Δෆ۩߹ ●ςετέʔεͷखॱΛաޡͨ͠··ใࠂ
 ●πʔϧ্ͷෆ۩߹
 ex) γϛϡϨʔλʔͷҟৗऴྃ ●ίϯςϯπͷϥϯμϜੑͷӨڹ ●ਖ਼ޡ൑ఆͷॊೈੑͷܽ೗ ϚχϡΞϧςετ E2Eςετ

Slide 16

Slide 16 text

ِཅੑͷൺֱ ●ςετ୺຤ґଘͷෆ۩߹
 ex) Ҏલͷςετͷঢ়ଶ͕࢒͍ͬͯΔͱ࠶ݱ͢Δෆ۩߹ ●ςετέʔεͷखॱΛաޡͨ͠··ใࠂ
 ●πʔϧ্ͷෆ۩߹
 ex) γϛϡϨʔλʔͷҟৗऴྃ ●ίϯςϯπͷϥϯμϜੑͷӨڹ ●ਖ਼ޡ൑ఆͷॊೈੑͷܽ೗ ϚχϡΞϧςετ E2Eςετ ݱঢ়ස౓͸ͪ͜Βͷ͕ ଟͦ͏

Slide 17

Slide 17 text

E2E΁ͷ׬શҠߦ͸ɺɺ ●਺ඦʙ਺ઍ͋Δςετ߲໨ΛҠߦ͸ॳظίετ͕
 ͔ͳΓ͔͔Δ ●׬શҠߦޙ΋มߋ͕ೖΔͨͼʹӡ༻ɺอक͕͔͔Δ ●ِཅੑ΋ແࢹͰ͖ͳ͍

Slide 18

Slide 18 text

ਪ঑Ͱ͖ΔϢʔεέʔε ϚχϡΞϧςετ͔ΒE2EςετʹҠߦ͢ΔϢʔεέʔε ●ϦϦʔεස౓Λ͍͋͛ͨ
 ྫʣαʔόʔͷΦϯσϚϯυϦϦʔεΛ࣮ݱ͢Δ
 → Өڹͷগͳ͍ϦϦʔε͸ϝΠϯػೳʹߜΓE2Eςετ → มߋ͕গͳ͘޻਺͕͔͔ΔςετΛࣗಈԽ → ಛఆͷέʔεͷΈΛࣗಈԽ ●ϚχϡΞϧςετͷ޻਺ΛҰఆ·ͰԼ͍͛ͨ
 ྫʣςελʔνʔϜͷਓһͷ্ݶ ●ಛघͳঢ়گͰൃੜ͢Δෆ۩߹͕ى͖ͯͳ͍͜ͱΛ୲อ
 ྫʣOpenAPI GeneratorͷόʔδϣϯʹͣΕ͕ͳ͍͔

Slide 19

Slide 19 text

●ϚχϡΞϧςετΛ׬શʹࣗಈԽͰ͖Δʁ ●ਓ͕΍ΔΑΓਖ਼֬ʹςετͰ͖ͦ͏ʁ ●UnitTest΍ଞͷςετͷ੹຿͕ݮΔʁ ●ςελʔνʔϜͰ΋ӡ༻Ͱ͖Δʁ λοϓϧͷE2EͷୈҰҹ৅

Slide 20

Slide 20 text

ଞͷςετͷ੹຿͕ݮΔʁ ࢀߟจݙɿhttps://alisterbscott.com Unit Test UI Test E2E Test Manual Test

Slide 21

Slide 21 text

Ϣχοτςετ͸ෆཁ͔ʁ ࢀߟจݙɿhttps://autify.com/ja/news/for-mobile-launch Unit Tests Component E2E Manual ໢ཏੑ ޿ ҆৺ײ ߴ

Slide 22

Slide 22 text

Ϣχοτςετ͸ෆཁ͔ʁ ࢀߟจݙɿhttps://autify.com/ja/news/for-mobile-launch Unit Tests Component E2E Manual ෆ҆ఆ ίετߴ ϦʔυλΠϜ௕

Slide 23

Slide 23 text

UI Test Linter E2E Test ཧ૝ͷόάݕ஌ Syntax Highlight Static type check ༧໿ޠλΠϙ ม਺໊λΠϙ ܕม׵ϛε ෼ذߟྀ࿙Ε ը໘ભҠϛε APIͷύʔεΤϥʔ Unit Test / Integration Test ࢀߟจݙɿhttps://speakerdeck.com/orgachem/ios-apurierajian-shi-falseshe-ji-tosofalsexiao-guo

Slide 24

Slide 24 text

UI Test Linter E2E Test ཧ૝ͷόάݕ஌ Syntax Highlight Static type check ༧໿ޠλΠϙ ม਺໊λΠϙ ܕม׵ϛε ෼ذߟྀ࿙Ε ը໘ભҠϛε APIͷύʔεΤϥʔ Unit Test / Integration Test ࢀߟจݙɿhttps://speakerdeck.com/orgachem/ios-apurierajian-shi-falseshe-ji-tosofalsexiao-guo όάͷൃݟ͕஗Ε ੜ࢈ੑ͕Լ͕͍ͬͯ͘

Slide 25

Slide 25 text

UI Test Linter E2E Test ཧ૝ͷόάݕ஌ Syntax Highlight Static type check ༧໿ޠλΠϙ ม਺໊λΠϙ ܕม׵ϛε ෼ذߟྀ࿙Ε ը໘ભҠϛε APIͷύʔεΤϥʔ Unit Test / Integration Test ࢀߟจݙɿhttps://speakerdeck.com/orgachem/ios-apurierajian-shi-falseshe-ji-tosofalsexiao-guo E2EςετͰ୲อ͢΂͖ 
 ͸ΞϓϦʹด͡ͳ͍ڍಈ

Slide 26

Slide 26 text

ΞΠεΫϦʔϜίʔϯͷ༠࿭ ࢀߟจݙɿhttps://alisterbscott.com Unit Test UI Test E2E Test Manual Test

Slide 27

Slide 27 text

ϐϥϛουΛ໨ࢦ͢ ࢀߟจݙɿhttps://autify.com/ja/news/for-mobile-launch Unit Tests Component E2E Manual ίετͷߴ͍ςετ ͷ੹຿ΛݮΒͯ͘͠

Slide 28

Slide 28 text

●ϚχϡΞϧςετΛ׬શʹࣗಈԽͰ͖Δʁ ●ਓ͕΍ΔΑΓਖ਼֬ʹςετͰ͖ͦ͏ʁ ●UnitTest΍ଞͷςετͷ੹຿͕ݮΔʁ ●ςελʔνʔϜͰ΋ӡ༻Ͱ͖Δʁ λοϓϧͷE2EͷୈҰҹ৅

Slide 29

Slide 29 text

ςετέʔε࡞੒ͷ೉қ౓ ࢀߟจݙɿhttps://autify.com/ja/news/for-mobile-launch

Slide 30

Slide 30 text

ςετέʔε࡞੒ͷ೉қ౓ جຊతʹ͸ίϯιʔϧ্ͰγϛϡϨʔλʔΛૢ࡞͢Δ͜ ͱͷΈͰςετΛ࡞੒Մೳ

Slide 31

Slide 31 text

●࡞੒ͷΈͰ͋Ε͹ӡ༻Մೳ ●πʔϧͷػೳͱͯ͠Ͱ͖ͳ͍͜ͱ͸ΤϯδχΞ͕ղܾ ͢Δඞཁ͕͋Δ ●ςετέʔεࣦഊ࣌ͷӡ༻ͱݪҼಛఆ͸೉қ౓͕͋Δ ςελʔνʔϜͰӡ༻Ͱ͖Δ͔ʁ

Slide 32

Slide 32 text

●ϥϯμϜͳจࣈྻೖྗ ●ςετέʔεؒͰͷঢ়ଶͷҾ͖ܧ͗ ●ϥϯμϜͳίϯςϯπͷબ୒
 ྫ) AutifyͰͰ͖ͳ͍͜ͱ

Slide 33

Slide 33 text

E2Eςετͷ໾ׂ·ͱΊ ●Ҡߦɾอकίετ͕େ͖͘׬શҠߦ͸ݫ͍͠ ●ϝΠϯϧʔϓ΍มߋͷগͳ͍ػೳ͔Βͷಋೖ͕͓͢͢Ί
 ●ςετͷΧόʔൣғ͸޿͍͕ϑΟʔυόοΫ͕஗͍ ●ςετ͝ͱͷਖ਼͍͠੹຿ͰόάΛݕ஌Ͱ͖ΔΑ͏ʹ͢΂͖ ●πʔϧͷૢ࡞ࣗମ͸؆୯ͳͷͰ୭Ͱ΋࡞੒͸Մೳ ●طଘͷػೳͰ͸ରԠ͖͠Εͳ͍ςετέʔε͕͋Γɺ
 ΤϯδχΞͷରԠ΋ඞཁ ϚχϡΞϧςετ͔ΒͷҠߦ E2Eςετͷ੹຿ E2Eπʔϧͷૢ࡞

Slide 34

Slide 34 text

2. λοϓϧʹ͓͚Δ
 E2Eςετͷಋೖ

Slide 35

Slide 35 text

λοϓϧE2E ϩʔυϚοϓ CICD؀ڥͷߏங ϝΠϯϧʔϓͷγφϦΦӡ༻ ಛఆέʔεͰͷE2E׆༻ ϚχϡΞϧςετͷࣗಈԽ ←ΠϚίί

Slide 36

Slide 36 text

λοϓϧE2E ϩʔυϚοϓ CICD؀ڥͷߏங ϝΠϯϧʔϓͷγφϦΦӡ༻ ಛఆέʔεͰͷE2E׆༻ ϚχϡΞϧςετͷࣗಈԽ ←ΠϚίί

Slide 37

Slide 37 text

CICD؀ڥͷߏங ·ͣ͸ΞϓϦͷߋ৽ʹΑͬͯࣗಈͰςετ࣮ߦ͞ΕΔαΠΫϧ Λͭ͘Δ mainϒϥϯν΁ͷPush, ϦϦʔεϒϥϯν࡞੒࣌ Github → Bitrise → Autify ·ͣ͸Ϣʔβͷ৽نొ࿥ τϦΨʔ ϫʔΫϑϩʔ ࣮ߦςετ

Slide 38

Slide 38 text

Bitrise্Ͱͷઃఆ ެࣜεςοϓ͕ར༻Ͱ͖ΔͨΊɺઃఆ͕؆୯

Slide 39

Slide 39 text

λοϓϧE2E ϩʔυϚοϓ CICD؀ڥͷߏங ϝΠϯϧʔϓͷγφϦΦӡ༻ ಛఆέʔεͰͷE2E׆༻ ϚχϡΞϧςετͷࣗಈԽ ←WIP

Slide 40

Slide 40 text

ϝΠϯϧʔϓγφϦΦ αʔόʔͷΈͷϢʔβʔӨڹͷͳ͍૝ఆͷϦϦʔε࣌ʹϝΠ ϯͷػೳͷಈ࡞୲อ͕Ͱ͖Δঢ়ଶ 1. ঁੑͰͷ৽نొ࿥ 2. ᶃͰొ࿥ͨ͠ঁੑͰ͍͍͔΋ɺ͍·͍ͪ 3. ᶃͰొ࿥ͨ͠ঁੑͰλϒόʔͷ֤λϒͷදࣔ 4. ᶃͰొ࿥ͨ͠ঁੑͰஉੑ1ʹ͍͍͔΋ 5. உੑ1ͰᶃͰొ࿥ͨ͠ঁੑͱϚον͠ɺϝοηʔδૹ৴ 6. ᶃͰొ࿥ͨ͠ঁੑͰϝοηʔδͷฦ৴ 7. ᶃͰొ࿥ͨ͠ঁੑͰୀձ ର৅γφϦΦ

Slide 41

Slide 41 text

ԼهͷσόοάػೳΛ༻ҙ 1. ࠷৽ͷE2EͰ࡞੒ͨ͠ঁੑʹϩάΠϯ γφϦΦؒͰϩάΠϯ৘ใΛҾ͖ܧ͛ͳ͍ͨΊ؅ཧը໘ APIͰϩάΠϯ 2. உੑ1ʹର͍͍͔ͯ͠΋ΛૹΔ ϑϦοΫର৅͸ϥϯμϜੑ͕͋ΔͨΊɺର৅Ϣʔβʔʹ ͍͍͔΋ΛૹΔσόοάػೳ͕ඞཁ ઓུᶃ ઐ༻ͷσόοάػೳΛ༻ҙ

Slide 42

Slide 42 text

ಛఆͷػೳͷແޮԽͳͲɺE2EςετதʹϩδοΫͷ෼ذ Λ࡞Δ͜ͱ͕Ͱ͖ΔΑ͏ಠࣗεΩʔϚΛ࡞੒ ઓུᶄ E2E༻ͷಠࣗεΩʔϚ var isAvailable: Bool { #if E2E // E2Eςετத͸ৗʹfalse return false #else // Feature Flagʹઃఆ͞Εͨ஋Λฦ͢ return remoteConfig[.isEnable] #endif }

Slide 43

Slide 43 text

ಉ͡Ϣʔβʔ͕Կਓ΋࡞੒͞Εͨ··ʹͳΒͳ͍Α͏ʹ ৽نొ࿥ͤ͞ΔγφϦΦ͸ୀձͤ͞ΔγφϦΦ΋ؚ·ͤΔ ઓུᶅ ຖճγφϦΦͰୀձͤ͞Δ

Slide 44

Slide 44 text

·ͣ͸গͳ͍γφϦΦͰӡ༻Λ·Θ͠ɺϝϯόʔؒͰͷ मਖ਼ํ๏΍ɺݪҼಛఆͷӡ༻εΩϧΛ޲্ͤ͞Δ ઓུᶆ ӡ༻ͷ஌ݟΛͨΊΔ

Slide 45

Slide 45 text

݁ՌΛSlackʹ௨஌͢Δػೳ͸Autifyʹ͋Δ΋ͷͷɺ ʮ୭͕͍ͭͲͷมߋΛىҼʹ࣮ͯ͠ߦͤͨ͞ςετ͔ʁʯ ͷ৘ใ͕ͳ͍ͨΊςετ݁ՌͷϋϯυϦϯά͕՝୊ͩͬͨ → E2EςετΛCI͔ΒτϦΨʔͨ͠ࡍʹSlackʹ΋௨஌ ઓུᶇ ςετ։࢝࣌ʹCI͔Β௨஌

Slide 46

Slide 46 text

λοϓϧE2E ϩʔυϚοϓ CICD؀ڥͷߏங ϝΠϯϧʔϓͷγφϦΦӡ༻ ಛఆέʔεͰͷE2E׆༻ ϚχϡΞϧςετͷࣗಈԽ ←WIP

Slide 47

Slide 47 text

ಛఆέʔεͰͷE2E׆༻ ΫϥΠΞϯτɺόοΫΤϯυؒͰOpenAPI Generator͕ੜ੒ ͨ͠ґଘϥΠϒϥϦͷόʔδϣϯ͕ͣΕ͍ͯͳ͍͜ͱΛ୲อ ։ൃதͷػೳ͕Feature FlagʹΑͬͯఏڙ͞Ε͍ͯͳ͍͜ͱ Λ֬ೝ ΫϥΠΞϯτ⁶αʔόؒͷόʔδϣϯಉظ ։ൃதͷػೳ

Slide 48

Slide 48 text

λοϓϧE2E ϩʔυϚοϓ CICD؀ڥͷߏங ϝΠϯϧʔϓͷγφϦΦӡ༻ ಛఆέʔεͰͷE2E׆༻ ϚχϡΞϧςετͷࣗಈԽ ←WIP

Slide 49

Slide 49 text

ϚχϡΞϧςετͷࣗಈԽ ݱࡏϚχϡΞϧςετதͷ ●มߋ͕গͳ͘ӡ༻ίετ͕௿͍߲໨ ●ςελʔ͕֬ೝʹ࣌ؒΛ͔͚͍ͯΔՕॴ Λର৅ʹϚχϡΞϧςετͷςετέʔεΛચ͍ग़͠ɺ ҠߦΛ໨ࢦ͍ͯ͠·͢

Slide 50

Slide 50 text

·ͱΊ 1.E2Eςετͷ໾ׂ E2EͱϚχϡΞϧςετͷҧ͍ / ଞςετͱͷద੾ͳ࢖͍෼͚ 2.λοϓϧʹ͓͚ΔE2Eςετͷಋೖ ·ͣ͸ϝΠϯϧʔϓ͔Β / ӡ༻ྗΛຏ͘ 3.ར༻্ͷ՝୊ͱͦͷղܾํ๏ πʔϧΛσόοάػೳͰΧόʔ / E2E༻ͷಠࣗεΩʔϚ