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

Python ユニットテスト入門編 - ユニットテストの概念を学ぶ

Python ユニットテスト入門編 - ユニットテストの概念を学ぶ

以前主催した社内勉強会 "Testability exercise" の導入として説明した、ユニットの意義とその使い方の概念を掴むための資料です。
サーバーレス(およびServerless Framework)を扱う案件が社内的にも増加しているので、その手の話題も含まれています。

書いてある内容は発表当時の私の見解です。人により異論はあると思うのでフィードバックお待ちしています。

hassaku63

June 03, 2020
Tweet

More Decks by hassaku63

Other Decks in Programming

Transcript

  1. Unittest ͷೖ໳
    #testability-exercise

    View full-size slide

  2. ※͜ͷࢿྉ͸ࣾ಺޲͚ʹ։࠵ͨ͠ςετίʔυͷ

    ษڧձࢿྉΛ֎෦ެ։޲͚ʹ࠶ฤͨ͠΋ͷͰ͢

    View full-size slide

  3. Agenda
    1. Unittest جຊ֓೦
    2. ࣮ફ

    View full-size slide

  4. Unittest جຊ֓೦

    View full-size slide

  5. What is
    ੾Γ཭͢͜ͱ͕Ͱ͖Δ࠷খͷίʔυϢχοτΛݕূ͢Δ΋ͷ
    • ԿΛʮ੾Γ཭͢ʯͷ͔ʁ
    • ྫʣӬଓԽ૚ʹΞΫηε͢Δػೳɺ֎෦APIʹϦΫΤετΛൃߦ͢Δػ
    ೳɺͳͲ
    • ݕূ݁Ռͷ߹൱ΛܾΊΔԿΒ͔ͷνΣοΫʢΞαʔγϣϯʣΛ
    ؚΉ

    View full-size slide

  6. Why (1/3)
    ίʔυͷઃܭ͕վળ͞ΕΔʢ࠷ॏཁʣ
    • ࣗ෼͕࡞ͬͨʮϢχοτʯ͕؆୯ʹςετͰ͖ͳ͍৔߹͸ɺԿ͔ͷઃܭ͕Πέͯͳ͍αΠϯ͔΋
    • e.g) ςετέʔεͷηοτΞοϓ͕೉ղɹˠɹඞཁҎ্ʹʮঢ়ଶʯΛ͔࣋ͪ͗͢΋ʁ
    • ͦͷϢχοτ͕ա৒ʹ੹຿Λ࣋ͪ͗ͨ͢ઃܭʹͳ͍ͬͯΔ͔΋͠Εͳ͍ͱΘ͔Δ
    • ࣗ෼ͷઃܭΛʢΑΓϝϯςφϒϧͳߏ଄ʹ͢ΔͨΊʹʣධՁ͢Δ࡞ۀɺͱ΋ݴ͑Δ
    • ςετͮ͠Β͍ຊ൪ίʔυΛ໧ೝͯ͠ແཧ͘Γద߹ͤͯ͞͠·͏ͱɺϢχοτςετͷࢫຯ͕ݮΔ

    View full-size slide

  7. Why (2/3)
    Ҿ͖ܧ͗ޙͷ୲౰ऀ͕ιϑτ΢ΣΞͷ࢓༷Λཧղ͢ΔͨΊʹ໾ཱͭ
    • ։ൃͨ͠ίʔυ͕ຊ౰ʹՁ஋Λ΋ͨΒ͢ͷ͸։ൃ׬ྃ࣌఺Ͱ͸ͳ͘อकϑΣʔζͰ͋Δ
    • ίʔυ͸ɺॻ࣌ؒ͘ΑΓಡ·ΕΔ࣌ؒͷํ͕ଟ͍
    • ෳࡶͰอकͮ͠Β͍ίʔυ͸ɺະདྷͷՁ஋ͷϙςϯγϟϧΛଛͳ͏
    • ͦͷίʔυϢχοτΛͲͷΑ͏ʹ࢖͏΂͖͔ɺҙਤͨ͠࢓༷ɾ࢖͍ํΛਪ࡯Ͱ͖Δ
    • ※ͨͩ͠ɺdocstring ΍ͦͷଞͷυΩϡϝϯτʢશମߏ੒ʗઃܭࢥ૝ʗσϓϩΠαΠΫϧͷखॱͳͲʣ
    Λॆ࣮ͤ͞ΔͳͲɺଞʹ΋Ҿ͖ܧ͗ͷͨΊͷඞཁཁૉ͸͍͘ΒͰ΋͋Δ

    View full-size slide

  8. Why (3/3)
    Ϣχοτςετ͕ࣗಈςετͷૅʹͳΔʢ෭࣍తͳϝϦοτʣ
    • ࣗಈςετΛऔΓೖΕΔ͜ͱͰػೳվमͷݕূ͕εϐʔσΟʹͳΔ

    ʹՁ஋ΛੜΈग़͢αΠΫϧΛΑΓૣ͘ճͤΔ
    • ※ࣗಈςετͷલఏͱͯ͠ɺҙຯͷ͋ΔˍࣗಈԽ͠΍͍͢Ϣχοτςετ͕ॻ͚͍ͯΔ͜ͱ͕ॏཁ
    ʹͳΔ
    • ※ຊདྷతʹ͸Ϣχοτςετ͚ͩͰͳ݁͘߹ςετ΋ߦͬͯɺϢʔεέʔεతʹҙຯΛཻ࣋ͭ౓ͷ
    ςετ΋͋ͬͨํ͕Α͍

    View full-size slide

  9. How
    ʮ࣮૷͕ਖ਼͘͠ػೳ͍ͯ͠ΔͳΒ݁Ռ͸͜͏ͳΔ͸ͣʯΛݕূ
    • ಛఆ৚݅ʢҾ਺౳ʣΛ༩͑ͨ৔߹ͷ໭Γ஋Λݕূ
    • ςετର৅͕࢖༻͢Δ֎෦ػೳΛ૝ఆ௨Γݺͼग़ͤΔ͔Ͳ͏͔
    • ૝ఆ௨ΓʹίέΔ͜ͱ΋ʮਖ਼͠͞ʯͷݕূʹͳΔ

    View full-size slide

  10. How
    ਖ਼ৗܥͷςετ

    View full-size slide

  11. How
    ਖ਼ৗܥͷςετ
    ظ଴͢Δೖྗʗग़ྗ
    Ξαʔγϣϯ

    View full-size slide

  12. How
    ҟৗܥͷςετ
    • int Ҏ֎ͷ৔߹͸

    ValueError ྫ֎Λ্͛Δ

    ࢓༷Λ௥Ճ

    View full-size slide

  13. How
    ҟৗܥͷςετ
    • int Ҏ֎ͷ৔߹͸

    ValueError ྫ֎Λ্͛Δ

    ࢓༷Λ௥Ճ
    ੔਺ܕҎ֎ͷέʔεʢ͜͜Ͱ͸จࣈྻܕʣΛ
    ਖ਼ৗʹ஄ͨ͘ΊͷόϦσʔγϣϯΛ௥Ճ
    BEE
    ʹจࣈྻΛೖྗ͢Δͱ
    7BMVF&SSPSͰ
    ஄͔ΕΔ͜ͱΛݕূ

    View full-size slide

  14. How
    ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ

    Ϣχοτςετ
    • ࿈ܞ͢ΔػೳΛμϛʔʹ

    ࠩ͠ସ͑Δ (mock)
    ࣮ྫ͸͜ͷޙͷ
    ϋϯζΦϯηογϣϯͷ෦Ͱ

    View full-size slide

  15. Mock ͱ͸ … ʁʁʁʁʁ

    View full-size slide

  16. Mock
    ผػೳͱͷ࿈ܞΛؚΉؔ਺ͷ

    Ϣχοτςετ
    • ࿈ܞ͢ΔػೳΛμϛʔʹ

    ࠩ͠ସ͑Δ (mock)
    ϝΠϯϩδοΫ ֎෦"1*
    %#ΞΫηε
    ɾɾɾ

    View full-size slide

  17. Mock
    ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ

    Ϣχοτςετ
    • ࿈ܞ͢ΔػೳΛμϛʔʹ

    ࠩ͠ସ͑Δ (mock)
    ϝΠϯϩδοΫ ֎෦"1*
    %#ΞΫηε
    ɾɾɾ
    ͜ΕΛϢχοτςετ͍ͨ͠

    View full-size slide

  18. Mock
    ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ

    Ϣχοτςετ
    • ࿈ܞ͢ΔػೳΛμϛʔʹ

    ࠩ͠ସ͑Δ (mock)
    ϝΠϯϩδοΫ ֎෦"1*
    %#ΞΫηε
    ɾɾɾ
    ϝΠϯͷςετΛ͢Δ্Ͱ͸ɺ
    ͍ͭ͜ΒͷӨڹ͕अຐ

    View full-size slide

  19. Mock
    ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ

    Ϣχοτςετ
    • ࿈ܞ͢ΔػೳΛμϛʔʹ

    ࠩ͠ସ͑Δ (mock)
    ϝΠϯϩδοΫ ֎෦"1*
    NPDL

    %#ΞΫηε
    NPDL

    ɾɾɾ
    NBJOͷςετ࣌ͷΈɺ
    μϛʔʹࠩ͠ସ͑ΔNPDL

    View full-size slide

  20. Mock
    ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ

    Ϣχοτςετ
    • ࿈ܞ͢ΔػೳΛμϛʔʹ

    ࠩ͠ସ͑Δ (mock)
    ϝΠϯϩδοΫ ֎෦"1*
    NPDL

    %#ΞΫηε
    NPDL

    ɾɾɾ
    ϝΠϯ͔Βར༻͢ΔTVCͷػೳʢؔ਺ͱ͔ʣ͕
    μϛʔͷ஋Λฦ͢Α͏ʹઃఆ

    View full-size slide

  21. Mock
    ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ

    Ϣχοτςετ
    • ࿈ܞ͢ΔػೳΛμϛʔʹ

    ࠩ͠ସ͑Δ (mock)
    ϝΠϯϩδοΫ ֎෦"1*
    NPDL

    %#ΞΫηε
    NPDL

    ɾɾɾ
    NBJOͷςετ࣌ͷΈɺ
    μϛʔʹࠩ͠ସ͑ΔNPDL
    ֎෦ӨڹΛഉআͯ͠ɺϝΠϯϩδοΫͷΈͷ
    ಈ࡞ΛݟΔ͜ͱ͕Ͱ͖Δ

    View full-size slide

  22. Mock
    ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ

    Ϣχοτςετ
    • ࿈ܞ͢ΔػೳΛμϛʔʹ

    ࠩ͠ସ͑Δ (mock)
    ϝΠϯϩδοΫ ֎෦"1*
    NPDL

    %#ΞΫηε
    NPDL

    ɾɾɾ
    NPDLͨ͠ػೳΛʮͲ͏࢖ͬͨͷ͔ʯ؍఺
    ˞ݺͼग़͠ͷҾ਺΍ɺͦͷճ਺ͳͲ

    View full-size slide

  23. Mock - Α͋͘Δ࢖ΘΕํ (1)
    ॴҦϢʔεέʔεʢػೳཁ݅ͷ࠷্ҐʹདྷΔΑ͏ͳ΋ͷʣΛ

    ςετ͢Δ৔߹ʹɺଞͷϞδϡʔϧͱͷ࿈ܞΛ֬ೝ͢Δ
    • ϝΠϯϩδοΫʹ͋ΔೖྗΛ༩͑ͨ৔߹ʹɺ

    ૝ఆ௨ΓʹαϒػೳΛݺͼग़ͯ͠

    ͍Δ͔Ͳ͏͔ʢMockͷݺͼग़͞ΕํΛݟΔʣ
    ϝΠϯ
    ϩδοΫ
    ֎෦"1*
    %#ΞΫηε
    ɾɾɾ
    ͜͜ͷ࿈ܞ͕૝ఆ௨Γʹͳ͍ͬͯΔ͔Ͳ͏͔

    View full-size slide

  24. Mock - Α͋͘Δ࢖ΘΕํ (2)
    ςετର৅ʢ͜͜Ͱ͸ػೳAʣࣗ਎΋ผͷ্Ґػೳ͔Βݺͼग़͞Εɺ

    ͳΜΒ͔ͷ໭Γ஋Λฦ͢ػೳͰ͋Δ৔߹
    • ػೳAͷґଘઌ(sub) Λ

    ϞοΫ্ͨ͠Ͱ

    ೖྗʗग़ྗύλʔϯΛ

    assert ͢Δ
    ػೳ" ֎෦"1*
    %#ΞΫηε
    feature sub
    ɾɾɾ
    ϝΠϯ
    ϩδοΫ
    main
    ͜͜ͷڍಈΛνΣοΫͯ͠
    ػೳ"Λݕূ͍ͨ͠
    ഉআ͍ͨ͠
    ֎෦Өڹ

    View full-size slide

  25. ࣄલ஌ࣝɿϋϯζΦϯͷલʹ

    View full-size slide

  26. Ϟδϡʔϧͷ࿩
    πϦʔͷԼʹσΟϨΫτϦΛ੾ͬͯ __init__.py Λ഑ஔ͢ΔͱɺPython (ͷ importlib) ͸

    ͦͷσΟϨΫτϦΛʮϞδϡʔϧʯͱͯ͠ೝࣝ͢ΔΑ͏ʹͳΓ·͢ʢࢀߟʣɻ
    ιʔεπϦʔ͔Βࣗ࡞ιʔεΛ importʢ·ͨ͸ from ~ importʣͰ͖ΔΑ͏ʹͳΓ·͢ɻ
    import Մೳ
    import ෆՄ
    >>> import my_module
    >>> from my_module import handler

    View full-size slide

  27. Α͋͘Διʔεߏ੒
    Α͋͘Δͷ͸ࠨɻγϯϓϧͳ࡞ΓͳΒӈͷύλʔϯ΋͋Δ
    ϧʔτσΟϨΫτϦ͔Β
    ։ൃର৅ͱςετΛ෼཭
    ֤ϞδϡʔϧͱಉҰ֊૚ʹ
    ։ൃର৅ͱςετΛಉډ

    View full-size slide

  28. sls ʹ͓͚Δ௥Ճύοέʔδͷόϯυϧ
    serverless-python-requirements Λ࢖͏ͷ͕ศརʢϫʔΫγϣοϓͷιʔεͰ΋࢖༻͍ͯ͠·͢
    • requirements.txt ΍ Pipfile ͷ಺༰Λউखʹόϯυϧͯ͘͠ΕΔ
    • requirements.txt Λ࢖͍ͬͯΔ৔߹͸ಛʹ௥Ճઃఆෆཁ
    • ೚ҙ໊শͰ΋ରԠՄೳɻ #Customize requirements file name ͷηΫγϣϯΛࢀর
    • layer ͷ࡞੒΋Ͱ͖Δ (#Lambda Layer ηΫγϣϯΛࢀর)
    serverless.yml هड़ྫ (Pipenv)

    View full-size slide

  29. Tips
    ςετର৅ͷʮ෭࡞༻(※)ʯΛߟྀ͢Δɻ෭࡞༻͸Ͱ͖Δ͚ͩݮΒ͢ or ہॴԽ͞Ε͍ͯΔ
    ํ͕ςετ͸͠΍͍͢
    • ೖྗ͕ಉ͡ͳΒ݁Ռ΋ৗʹಉ͡ʹͳΔΑ͏ʹ͢Δɻڍಈ͕༧ଌ͠΍͍͢ʢႈ౳ੑʣ
    • ෳࡶͳ಺෦ঢ়ଶʹґଘ͢ΔίʔυϢχοτ͸Ͱ͖Δ͚ͩͳ͍ํ͕Α͍
    • εςʔτϑϧͳػೳ͸શମͷҰ෦ʹԡ͠ࠐΉ
    • ֎෦Ϧιʔε΁ͷΞΫηε͸ผϞδϡʔϧʹ੾Γग़ͯ͠ɺ೚ͤΔ
    (※)… “ঢ়ଶ” ΛมԽͤ͞ɺͦͷޙͷॲཧ݁Ռʹ΋ӨڹΛ༩͑ΔԿΒ͔ͷॲཧΛࢦ͢ɻม਺΁ͷ୅ೖɺετϨʔδ΍DB΁ͷΞΫηεͳͲ

    View full-size slide

  30. Tips
    • ಺෦ঢ়ଶΛ࣋ͪɺڍಈ͕಺෦ঢ়ଶʹґଘ͢Δ
    • ʢඞવੑͷͳ͍ʣάϩʔόϧม਺΁ͷґଘ
    • ಛఆΫϥεͷϝϯόʔม਺΁ͷґଘ
    • ಉҰΫϥε಺ͷಠཱͨ͠ʢΑ͏ʹݟ͑ΔʣϝιουؒͰݺͼग़͠ॱংʹґଘؔ܎
    • ֎෦ػೳͱͷ࿈ܞؚ͕·Ε͍ͯΔ
    • 3rd party ͷ API ͷݺͼग़͠
    • DB ΞΫηεʗετϨʔδΞΫηε

    View full-size slide

  31. Tips
    ʮৄࡉʯΛܾΊଧͪ͢ΔίʔυΛॻ͘ͱɺςετΛॻ͘ͱ͖ʹۤ࿑͢Δ
    • ৄࡉͱ͸ʁ
    • σʔλϕʔεͷબఆ … RDB/Key-Value/ΠϯϝϞϦ ??
    • ֎෦αʔϏεͱͷ௨৴ํ๏ͷৄࡉ … http/websocket/grpc/graphql ͳͲ
    • ϑΝΠϧΛอଘ͢ΔετϨʔδͷछྨʢϩʔΧϧ or S3?? σʔλϑΥʔϚο
    τͷ࢓༷͸? ͳͲʣ

    View full-size slide

  32. Tips
    ʮৄࡉʯΛܾΊଧͪ͢ΔίʔυΛॻ͘ͱɺςετΛॻ͘ͱ͖ʹۤ࿑͢Δ
    • ͜ΕΒΛʮϢʔεέʔεʯͱͳΔϝΠϯϩδοΫʹϕλॻ͖͢Δͱ…
    • ϝΠϯϩδοΫͷςετͰʮৄࡉʯཁૉͷ۩ମతͳ࢖͍ํ΋ܾΊଧͪ͢Δඞཁ͕ग़Δ
    • มߋʹରͯ͠؆୯ʹӨڹΛड͚ͯ͠·͏ɻςετͷ౔୆͕੬ऑʹͳΔ
    • Αͬͯʮৄࡉʯ͕ϝΠϯϩδοΫ͔Β௚઀ݟ͑ͳ͍Α͏ʹ͢Δ
    • ۩৅ͷهड़Ͱ͸ͳ͘ɺந৅తͳΠϯλϑΣʔεͱͯ͠੾Γग़͢ɻ͜͏͢ΔͱϝΠϯϩ
    δοΫͱͦͷςετ͕҆ఆ͠΍͍͢

    View full-size slide

  33. Tips
    • ϢʔεέʔεΛ੔ཧ͠ɺͦΕΛදݱ͢Δந৅తͳ໊લͷΠϯλϑΣʔεΛ੾Γग़͢
    • ࣮૷ํ๏ͷৄࡉʢྫ͑͹SQLͷॻ͖ํͱ͔ʣΛӅṭ͢Δ͜ͱͰɺϢʔεέʔεࣗ
    ମͷϩδοΫ͸෦෼తͳৄࡉ࢓༷ͷมߋʹରͯ͠ӨڹΛड͚ͮΒ͘ͳΔ
    • ʮϕλॻ͖ʯ͢ΔΑΓ͸ɺػೳΛந৅తͳΠϯλϑΣʔεʹ੾Γग़ͯ͠ɺͦͷΠϯλ
    ϑΣʔεʹґଘͤ͞Δํ͕๬·͍͠
    • Factory method / Abstract Factory ύλʔϯ
    • ґଘੑͷ஫ೖʢDependency Injectionʣ

    View full-size slide

  34. FAQ?
    ʮςετۦಈ։ൃ (TDD) ʯ͸ςετͷٕ๏Ͱ͸ͳ͍
    • TDD͸։ൃͷख๏
    • ઌʹϢχοτςετΛॻ͖࢝ΊΔ͜ͱͰɺઃܭ΁ͷϑΟʔυ
    όοΫΛਝ଎ʹɺ͔ͭܧଓతʹಘΔ͜ͱ͕Ϟνϕ

    View full-size slide

  35. FAQ?
    xxx-local γϦʔζͱ͔ɺlocalstackͬͯͲ͏ͳΜʁ
    • ʢݸਓతҙݟʣ૯ධͱͯ͠͸ɺςετ༻్ͱͯ͠ݟΔͳΒΠϚΠνɻͲ͏ͯ͠΋ඞཁͳཧ༝͕ग़ͨ
    ͱ͖ʹ͚ͩݕ౼͢΂͖ → YAGNI ͷݪଇɻʮૣ͗ͨ͢࠷దԽʯʹؕͬͯ͸͍͚ͳ͍
    • localstack Λςετͷखஈͱͯ͠Ξςʹ͗͢͠Δͱ…
    • ςετ͸ຊ൪ίʔυͷҰ෦ͳͷͰɺߏ੒͕มΘͬͨΒ localstack ΋௥ਵ͢Δඞཁ͕͋Δ
    • localstack ͷҡ࣋؅ཧ͕อकίετʹͳͬͯ͠·͏ʢͦͯ͠ϝϯς͞Εͳ͍ෛ࠴ίʔυ΁ʣ

    View full-size slide

  36. FAQ?
    doctest ͬͯͲ͏ͳΜʁ
    • ຊ൪ίʔυʹॻ͔Εͨ”ಈ࡞͢Δ”࢓༷ॻͱͯ͠ɺҙٛ͸े෼͋Γͦ͏ʢಠཱͨ͠υΩϡϝϯτ͸์
    ஔ͞Ε΍͍͢ͷͰɺίʔυϕʔεͱಉ͡৔ॴʹ͋ΔυΩϡϝϯτͰ͋Δ͜ͱʹՁ஋͕͋Δʣ
    • ͱ͸͍͑ɺΤσΟλͷิ׬΍ docstring ಺ͷ࣮ߦίϯςΩετͳͲҙࣝ͢Δඞཁ͕͋Γͦ͏ͩ͠ɺ
    ୯७ʹॻ͖ͮΒ͍ͷͰݱ࣌఺Ͱ͋Μ·ΓϙδςΟϒͳҹ৅͸ͳ͍

    View full-size slide

  37. FAQ?
    xxx-local γϦʔζͱ͔ɺlocalstackͬͯͲ͏ͳΜʁ
    • lambda-local
    • ݸਓతʹ͸͋Μ·Γ༗ޮͳ࢖్͍͕ͳ͍ҹ৅
    • ϥϯλΠϜݻ༗ͷΤϥʔέʔε·Ͱݟ͍ͨͳΒΞϦʁ…Ͱ΋ͦΕ࣮ػͰ΍ͬʢུ

    View full-size slide

  38. FAQ?
    xxx-local γϦʔζͱ͔ɺlocalstackͬͯͲ͏ͳΜʁ
    • dynamodb-local
    • ख͔࣮ܰͭࡍʹΞΫηεͰ͖Δಈ࡞ݕূ؀ڥͱͯ͠͸ΞϦɻFunctional Test ʹ͸࢖͑Δ͔΋ʁ
    • ݸਓతʹ͸ΫΤϦܗࣜΛಈ࡞ݕূ͢Δͱ͖ʹ͋ͬͨΒ͍͍ఔ౓ɻσʔλͷग़͠ೖΕΛ൐͏ؔ਺ͷ
    ςετͰ͋Ε͹ɺී௨ʹMockͰ΋ࣄ଍ΓΔ
    • εΩʔϚมΘͬͯ΋ςετͷҰ؏ੑΛอ͍ͪͨͳΒ…ͨͩɺεΩʔϚมߋ͸DB૊Έ௚͔͠ʢLSI/
    GSI௥ՃͷΈͰʣطଘΫΤϦʹӨڹͳͩ͠ͱࢥ͏ͷͰɺҡ࣋ͷखؒʹݟ߹͏ͱ͸ߟ͑ͯͳ͍

    View full-size slide

  39. FAQ?
    xxx-local γϦʔζͱ͔ɺlocalstackͬͯͲ͏ͳΜʁ
    • localstack
    • ※࢖ͬͨ͜ͱͳ͍ͷͰͳΜͱͳ͘ͷҹ৅Λճ౴͠·͢
    • ϩʔΧϧͰͷݕূʢvalidateͰ͸ͳ͘ɺPoCతͳҙຯͷํʣʹ࢖͏΋ͷɺͱ͍͏ఔ౓
    • ςετ͸ຊ൪ίʔυͷҰ෦ͳͷͰɺίʔυͷมߋʹ൐͍ localstack ΋ҡ࣋؅ཧ͕ඞཁʹͳΔɻ

    Ҿ͖ܧ͗ίετɾอकίετ্͕͕Δ͕ɺͦΕʹݟ߹͏΄ͲͷϝϦοτ͕͋·Γݟ͍ͩͤͳ͍ҹ৅

    View full-size slide

  40. ࢀߟ
    • ॻ੶
    • Ϧʔμϒϧίʔυ ―ΑΓྑ͍ίʔυΛॻͨ͘ΊͷγϯϓϧͰ࣮ફతͳςΫχοΫ
    • ςετۦಈ։ൃ
    • ςετۦಈPython

    View full-size slide

  41. ※ϋϯζΦϯηογϣϯ΁

    View full-size slide

  42. ςετΛࢧԉ͢Δύοέʔδ (1/2)
    • tmpfile … Pythonඪ४ύοέʔδɻϑΝΠϧͷI/OΛςετ͢Δඞཁ͕͋Δ৔߹ʹɺςετதͷΈ࢖
    ༻͢ΔҰ࣌తͳϑΝΠϧ/σΟϨΫτϦΛ࡞ΕΔ
    • nose … unittestΛ΋ͬͱศརʹ͢Δ΍ͭ
    • pytest … unittestΛ΋ͬͱศརʹ͢Δ΍ͭ
    • coverage … ΧόϨοδϨϙʔτͷੜ੒ (nose, pytest ͳͲʹϓϥάΠϯՄೳ)
    • tox … ෳ਺όʔδϣϯͷPythonͰςετΛ࣮ࢪ͢Δͱ͖ʹ࢖͏

    View full-size slide

  43. ςετΛࢧԉ͢Δύοέʔδ (2/2)
    • httpretty … ੜͷHTTPϦΫΤετΛϞοΫ͢Δʢ࣮૷ྫʣ
    • moto … boto3 ༻ͷMockʢBatchWriterͳͲҰ෦ඇରԠ͋Γʣ
    • aws sam cli … Lambda ͷ event Ҿ਺ͷαϯϓϧೖྗΛखૣ͘ੜ੒͢Δͷʹ࢖͑Δ
    • serverless-dynamodb-local … Serverless ϓϥάΠϯɻDynamoDB ͷϩʔΧϧಈ࡞ݕূʹศར

    View full-size slide

  44. See Also
    • Python document: unittest —- ϢχοτςετϑϨʔϜϫʔΫ
    • ςετۦಈ։ൃ
    • CAREER SKILLSɹιϑτ΢ΣΞ։ൃऀͷ׬શΩϟϦΞΨΠυ
    • ୈ29ষ ςετۦಈ։ൃͱϢχοτςετ
    • ୈ32ষ σόοά

    View full-size slide