GAS開発のJestによるモック入り結合テスト仕立て / The way to develop GAS with mocking integration test by Jest
by
Aqui TSUCHIDA
Link
Embed
Share
Beginning
This slide
Copy link URL
Copy link URL
Copy iframe embed code
Copy iframe embed code
Copy javascript embed code
Copy javascript embed code
Share
Tweet
Share
Tweet
Slide 1
Slide 1 text
~ ࣮༻ྫΛఴ͑ͯ ~ GAS։ൃͷ JestʹΑΔϞοΫೖΓ ݁߹ςετཱͯ 2018-10-17 Google Apps Script ׆༻ϛʔτΞοϓ #3 @AquiTCD
Slide 2
Slide 2 text
GAS ྑ͍Ͱ͢ΑͶʂ ͓खܰͰྑ͍Ͱ͢ΑͶʂ
Slide 3
Slide 3 text
Ͱ ಈ࡞֬ೝπϥ͘ͳ͍ʁ
Slide 4
Slide 4 text
ίʔυΛมߋ GASʹద༻ ϙνϙνΫϦοΫͯ͠ຊ൪Խ ͏·͘ಈ͔͘ͳ…ʁ
Slide 5
Slide 5 text
໘͗͘͢͞Δʂ ϙνϙνΫϦοΫͨ͠Γ… ϒϥβૢ࡞ͨ͠Γ…
Slide 6
Slide 6 text
͔ͩΒ ࣗಈςετͰ ָ͠·͠ΐ͏Αʂ
Slide 7
Slide 7 text
ࣗݾհ Aqui TSUCHIDA ా ໌৴ @AquiTCD αʔόʔαΠυΤϯδχΞ at झຯ: ϑϩϯτΤϯυ։ൃ #ྉཧ #ےτϨ #ήʔϚʔ #ݩόοΫύοΧʔ https://aquitcd.github.io/Pentazemin/ja/ Pentazemin: ElectronλεΫཧΞϓϦ https://aquitcd.github.io/yantan/ja/ YANTAN: Chrome֦ு Rubyist, JSer
Slide 8
Slide 8 text
ΞδΣϯμ - ࠓ͢͜ͱ • ςετΛՄೳʹ͢Δڥ • ࣮ࡍͷέʔεΛྫͱͯ͠հ • ݁߹ςετͷͨΊʹΔ͜ͱ ※͜͜Ͱೖྗ͔Βग़ྗ·Ͱͷςετͱ͠·͢ ࠓ͞ͳ͍͜ͱ • ڥߏஙͷࡉ͔͍(clasp, webpackͷಋೖํ๏ͳͲʣ • JestͰͷςετίʔυͷॻ͖ํ αϯϓϧίʔυͷGist: https://gist.github.com/AquiTCD/81294f568b823e5eecca11a182a69e14
Slide 9
Slide 9 text
ڥ ϩʔΧϧ։ൃͰ͖ΔΑ͏ʹ ES6 + Module ςετڥ Φεεϝ3ͭͷηοτ • Clasp https://github.com/google/clasp • Webpack https://webpack.js.org/ • Jest https://jestjs.io/ja/
Slide 10
Slide 10 text
Clasp is Կʁ ϩʔΧϧͰ։ൃͰ͖ΔͱԿ͕͍͍ͷʁ • GitཧͰ͖Δ • Linter, Formatter͕ޮ͘ • ES6ͷه๏Ͱॻ͚Δ • ςετ͕ॻ͚ͯճͤΔ $ clasp push $ clasp deploy ͳͲͰຊ൪ద༻Ͱ͖ͪΌ͏ ϩʔΧϧڥͰGASΛ։ൃͰ͖ΔCLIπʔϧ = εΫϦϓτΤσΟλͰॻ͔ͳ͍͍ͯ͘
Slide 11
Slide 11 text
Webpack ͱ Jest • JSͷ͋Ε͜ΕΛΨονϟϯί • ඞਢͰͳ͍ͷͰผͷπʔϧͰՄ • Jest • facebookͷςετπʔϧ • ΦʔϧΠϯϫϯ • ڧྗͳϞοΫϥΠϒϥϦΛଂ
Slide 12
Slide 12 text
ྫ IF GitHubʹ ϓϧϦΫΤετ͕Ͱ͖ͨΒ THEN Chatworkʹ ௨͍ͤͨ͞
Slide 13
Slide 13 text
GitHub Chatwork GAS Webhook: JSON API: TEXT Sheets 設定を参照 doPost(e)
Slide 14
Slide 14 text
GASͷಈ࡞Λςετʹ͢Δ 1. Jestʹάϩʔόϧࢦఆ 2. GASͷΈࠐΈΫϥεΛϞοΫ 3. GAS༻ϥΠϒϥϦͷସͱϞοΫ 4. ্هΛςετ༻ͷηοτΞοϓͱͯ͠·ͱΊΔ 5. WebhookΛςετϑΟΫενϟͱͯ͠༻ҙ 6. ςετͷ࠷ॳͰಡΈࠐΉ 7. ςετΛॻ͍ͯճ͢
Slide 15
Slide 15 text
GASͷಈ࡞Λςετʹ͢Δ 1. Jestʹάϩʔόϧࢦఆ 2. GASͷΈࠐΈΫϥεΛϞοΫ 3. GAS༻ϥΠϒϥϦͷସͱϞοΫ 4. ্هΛςετ༻ͷηοτΞοϓͱͯ͠·ͱΊΔ 5. WebhookΛςετϑΟΫενϟͱͯ͠༻ҙ 6. ςετͷ࠷ॳͰಡΈࠐΉ 7. ςετΛॻ͍ͯճ͢
Slide 16
Slide 16 text
Jestʹάϩʔόϧࢦఆ • package.json ͷ Jest config
Slide 17
Slide 17 text
Jestʹάϩʔόϧࢦఆ • package.json ͷ Jest config globals ʹ ༻ͯ͠Δ ΈࠐΈΫϥεΛ એݴ͢Δ
Slide 18
Slide 18 text
GASͷಈ࡞Λςετʹ͢Δ 1. Jestʹάϩʔόϧࢦఆ 2. GASͷΈࠐΈΫϥεΛϞοΫ 3. GAS༻ϥΠϒϥϦͷସͱϞοΫ 4. ্هΛςετ༻ͷηοτΞοϓͱͯ͠·ͱΊΔ 5. WebhookΛςετϑΟΫενϟͱͯ͠༻ҙ 6. ςετͷ࠷ॳͰಡΈࠐΉ 7. ςετΛॻ͍ͯճ͢
Slide 19
Slide 19 text
GASͷΈࠐΈΫϥεΛϞοΫ SpreadSheet ͷ ֤ Sheet ΛϞοΫίʔυͰදݱ͢Δʹ
Slide 20
Slide 20 text
GASͷΈࠐΈΫϥεΛϞοΫ
Slide 21
Slide 21 text
GASͷΈࠐΈΫϥεΛϞοΫ globals Ͱઃఆͨ͠ SpreadSheetApp ͷ getActiveSpreadSheet ϝιουͰ SpreadSheet ΠϯελϯεΛฦ͢Α͏ʹ Jest.fn() ͰϞοΫ
Slide 22
Slide 22 text
GASͷΈࠐΈΫϥεΛϞοΫ SpreadSheet Λ new ͨ͠Β Sheet ʹ໊લΛ͚ͭͯ new ͢ΔΑ͏ʹϞοΫ
Slide 23
Slide 23 text
GASͷΈࠐΈΫϥεΛϞοΫ getSheetByName() ϝιου sheet ΠϯελϯεΛฦ͢ϞοΫ࣮
Slide 24
Slide 24 text
GASͷΈࠐΈΫϥεΛϞοΫ • repos γʔτ
Slide 25
Slide 25 text
GASͷΈࠐΈΫϥεΛϞοΫ • members γʔτ
Slide 26
Slide 26 text
GASͷΈࠐΈΫϥεΛϞοΫ
Slide 27
Slide 27 text
GASͷΈࠐΈΫϥεΛϞοΫ 1ߦ1ͭͷྻ ෳߦߦͷྻͷྻ
Slide 28
Slide 28 text
GASͷΈࠐΈΫϥεΛϞοΫ 1ߦ1ͭͷྻ ෳߦߦͷྻͷྻ
Slide 29
Slide 29 text
GASͷΈࠐΈΫϥεΛϞοΫ 1ߦ1ͭͷྻ ෳߦߦͷྻͷྻ
Slide 30
Slide 30 text
GASͷΈࠐΈΫϥεΛϞοΫ Sheet Ϋϥεʹ ༻ͯ͠ΔϝιουΛ γϛϡϨʔτͨ͠ϞοΫ࣮Λ͢Δ
Slide 31
Slide 31 text
GASͷಈ࡞Λςετʹ͢Δ 1. Jestʹάϩʔόϧࢦఆ 2. GASͷΈࠐΈΫϥεΛϞοΫ 3. GAS༻ϥΠϒϥϦͷସͱϞοΫ 4. ্هΛςετ༻ͷηοτΞοϓͱͯ͠·ͱΊΔ 5. WebhookΛςετϑΟΫενϟͱͯ͠༻ҙ 6. ςετͷ࠷ॳͰಡΈࠐΉ 7. ςετΛॻ͍ͯճ͢
Slide 32
Slide 32 text
GAS༻ϥΠϒϥϦͷସͱϞοΫ • package.json ͷ Jest config globals ʹ ༻ͯ͠Δ ϥΠϒϥϦͷ ΫϥεΛએݴ͢Δ
Slide 33
Slide 33 text
GAS༻ϥΠϒϥϦͷସͱϞοΫ
Slide 34
Slide 34 text
GAS༻ϥΠϒϥϦͷସͱϞοΫ Underscore lodash ΛಡΈࠐΉ͜ͱͰସ Moment Moment.moment ͱͳΔΑ͏ʹ एׯ͍ํ͕ҟͳΔͷͰɺҾΛ͢Α͏ʹସ
Slide 35
Slide 35 text
GAS༻ϥΠϒϥϦͷସͱϞοΫ APIΛ sendMessage Λ୯७ʹreturn͢ΔΑ͏ϞοΫ → ͜ͷΔ `msgObj` ΛΞαʔγϣϯʹ͔͚Δ͜ͱͰ ςετ͕ՄೳʹͳΔ ChatWorkClient ͷ Client ΛϞοΫ࣮
Slide 36
Slide 36 text
GASͷಈ࡞Λςετʹ͢Δ 1. Jestʹάϩʔόϧࢦఆ 2. GASͷΈࠐΈΫϥεΛϞοΫ 3. GAS༻ϥΠϒϥϦͷସͱϞοΫ 4. ্هΛςετ༻ͷηοτΞοϓͱͯ͠·ͱΊΔ 5. WebhookΛςετϑΟΫενϟͱͯ͠༻ҙ 6. ςετͷ࠷ॳͰಡΈࠐΉ 7. ςετΛॻ͍ͯճ͢
Slide 37
Slide 37 text
GASͷಈ࡞Λςετʹ͢Δ 1. Jestʹάϩʔόϧࢦఆ 2. GASͷΈࠐΈΫϥεΛϞοΫ 3. GAS༻ϥΠϒϥϦͷସͱϞοΫ 4. ্هΛςετ༻ͷηοτΞοϓͱͯ͠·ͱΊΔ 5. WebhookΛςετϑΟΫενϟͱͯ͠༻ҙ 6. ςετͷ࠷ॳͰಡΈࠐΉ 7. ςετΛॻ͍ͯճ͢
Slide 38
Slide 38 text
WebhookΛςετϑΟΫενϟͱͯ͠༻ҙ • ྫ: test/fixtures/gh_pr.json ҎԼུ
Slide 39
Slide 39 text
GASͷಈ࡞Λςετʹ͢Δ 1. Jestʹάϩʔόϧࢦఆ 2. GASͷΈࠐΈΫϥεΛϞοΫ 3. GAS༻ϥΠϒϥϦͷସͱϞοΫ 4. ্هΛςετ༻ͷηοτΞοϓͱͯ͠·ͱΊΔ 5. WebhookΛςετϑΟΫενϟͱͯ͠༻ҙ 6. ςετͷ࠷ॳͰಡΈࠐΉ 7. ςετΛॻ͍ͯճ͢
Slide 40
Slide 40 text
ςετʹ·ͱΊΔ
Slide 41
Slide 41 text
ςετʹ·ͱΊΔ require Ͱςετίʔυͷ࠷ॳͰ ϞοΫ࣮͕·ͱ·ͬͨϑΝΠϧΛಡΈࠐΉ
Slide 42
Slide 42 text
ςετʹ·ͱΊΔ Webhook ͷJSONΛఆͨ͠ϑΟΫενϟΛηοτ
Slide 43
Slide 43 text
ςετʹ·ͱΊΔ doPost(e) ͷ࠷ޙChatworkͷsendMessage → ϞοΫͯ͠ΔͷͰ௨ͷத ςετதͰ୯७ʹreturn͞ΕΔͣ → ͭ·ΓฦΓΛΞαʔγϣϯʹ͔͚ΕOK
Slide 44
Slide 44 text
͏ ίʔυมߋ → σϓϩΠ ͏ʔΜ…ಈ͍ͯͳ͍ ·ͨมߋ → σϓϩΠ ͠ͳ͍͍ͯ͘ʂ
Slide 45
Slide 45 text
ςετΛಋೖͯ͠ ຊʹ͓ؾָͳ GAS։ൃΛ!!