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

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

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

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

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

Avatar for hassaku63

hassaku63

June 03, 2020
Tweet

More Decks by hassaku63

Other Decks in Programming

Transcript

  1. Why (2/3) Ҿ͖ܧ͗ޙͷ୲౰ऀ͕ιϑτ΢ΣΞͷ࢓༷Λཧղ͢ΔͨΊʹ໾ཱͭ • ։ൃͨ͠ίʔυ͕ຊ౰ʹՁ஋Λ΋ͨΒ͢ͷ͸։ൃ׬ྃ࣌఺Ͱ͸ͳ͘อकϑΣʔζͰ͋Δ • ίʔυ͸ɺॻ࣌ؒ͘ΑΓಡ·ΕΔ࣌ؒͷํ͕ଟ͍ • ෳࡶͰอकͮ͠Β͍ίʔυ͸ɺະདྷͷՁ஋ͷϙςϯγϟϧΛଛͳ͏ •

    ͦͷίʔυϢχοτΛͲͷΑ͏ʹ࢖͏΂͖͔ɺҙਤͨ͠࢓༷ɾ࢖͍ํΛਪ࡯Ͱ͖Δ • ※ͨͩ͠ɺdocstring ΍ͦͷଞͷυΩϡϝϯτʢશମߏ੒ʗઃܭࢥ૝ʗσϓϩΠαΠΫϧͷखॱͳͲʣ Λॆ࣮ͤ͞ΔͳͲɺଞʹ΋Ҿ͖ܧ͗ͷͨΊͷඞཁཁૉ͸͍͘ΒͰ΋͋Δ
  2. Mock ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ
 Ϣχοτςετ • ࿈ܞ͢ΔػೳΛμϛʔʹ
 ࠩ͠ସ͑Δ (mock) ϝΠϯϩδοΫ ֎෦"1* NPDL

    %#ΞΫηε NPDL ɾɾɾ ϝΠϯ͔Βར༻͢ΔTVCͷػೳʢؔ਺ͱ͔ʣ͕ μϛʔͷ஋Λฦ͢Α͏ʹઃఆ
  3. Mock ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ
 Ϣχοτςετ • ࿈ܞ͢ΔػೳΛμϛʔʹ
 ࠩ͠ସ͑Δ (mock) ϝΠϯϩδοΫ ֎෦"1* NPDL

    %#ΞΫηε NPDL ɾɾɾ NBJOͷςετ࣌ͷΈɺ μϛʔʹࠩ͠ସ͑ΔNPDL ֎෦ӨڹΛഉআͯ͠ɺϝΠϯϩδοΫͷΈͷ ಈ࡞ΛݟΔ͜ͱ͕Ͱ͖Δ
  4. Mock ผػೳͱͷ࿈ܞ͕͋Δؔ਺ͷ
 Ϣχοτςετ • ࿈ܞ͢ΔػೳΛμϛʔʹ
 ࠩ͠ସ͑Δ (mock) ϝΠϯϩδοΫ ֎෦"1* NPDL

    %#ΞΫηε NPDL ɾɾɾ NPDLͨ͠ػೳΛʮͲ͏࢖ͬͨͷ͔ʯ؍఺ ˞ݺͼग़͠ͷҾ਺΍ɺͦͷճ਺ͳͲ
  5. Mock - Α͋͘Δ࢖ΘΕํ (2) ςετର৅ʢ͜͜Ͱ͸ػೳAʣࣗ਎΋ผͷ্Ґػೳ͔Βݺͼग़͞Εɺ
 ͳΜΒ͔ͷ໭Γ஋Λฦ͢ػೳͰ͋Δ৔߹ • ػೳAͷґଘઌ(sub) Λ
 ϞοΫ্ͨ͠Ͱ


    ೖྗʗग़ྗύλʔϯΛ
 assert ͢Δ ػೳ" ֎෦"1* %#ΞΫηε feature sub ɾɾɾ ϝΠϯ ϩδοΫ main ͜͜ͷڍಈΛνΣοΫͯ͠ ػೳ"Λݕূ͍ͨ͠ ഉআ͍ͨ͠ ֎෦Өڹ
  6. sls ʹ͓͚Δ௥Ճύοέʔδͷόϯυϧ serverless-python-requirements Λ࢖͏ͷ͕ศརʢϫʔΫγϣοϓͷιʔεͰ΋࢖༻͍ͯ͠·͢ • requirements.txt ΍ Pipfile ͷ಺༰Λউखʹόϯυϧͯ͘͠ΕΔ •

    requirements.txt Λ࢖͍ͬͯΔ৔߹͸ಛʹ௥Ճઃఆෆཁ • ೚ҙ໊শͰ΋ରԠՄೳɻ #Customize requirements file name ͷηΫγϣϯΛࢀর • layer ͷ࡞੒΋Ͱ͖Δ (#Lambda Layer ηΫγϣϯΛࢀর) serverless.yml هड़ྫ (Pipenv)
  7. Tips ςετର৅ͷʮ෭࡞༻(※)ʯΛߟྀ͢Δɻ෭࡞༻͸Ͱ͖Δ͚ͩݮΒ͢ or ہॴԽ͞Ε͍ͯΔ ํ͕ςετ͸͠΍͍͢ • ೖྗ͕ಉ͡ͳΒ݁Ռ΋ৗʹಉ͡ʹͳΔΑ͏ʹ͢Δɻڍಈ͕༧ଌ͠΍͍͢ʢႈ౳ੑʣ • ෳࡶͳ಺෦ঢ়ଶʹґଘ͢ΔίʔυϢχοτ͸Ͱ͖Δ͚ͩͳ͍ํ͕Α͍ •

    εςʔτϑϧͳػೳ͸શମͷҰ෦ʹԡ͠ࠐΉ • ֎෦Ϧιʔε΁ͷΞΫηε͸ผϞδϡʔϧʹ੾Γग़ͯ͠ɺ೚ͤΔ (※)… “ঢ়ଶ” ΛมԽͤ͞ɺͦͷޙͷॲཧ݁Ռʹ΋ӨڹΛ༩͑ΔԿΒ͔ͷॲཧΛࢦ͢ɻม਺΁ͷ୅ೖɺετϨʔδ΍DB΁ͷΞΫηεͳͲ
  8. Tips ʮৄࡉʯΛܾΊଧͪ͢ΔίʔυΛॻ͘ͱɺςετΛॻ͘ͱ͖ʹۤ࿑͢Δ • ৄࡉͱ͸ʁ • σʔλϕʔεͷબఆ … RDB/Key-Value/ΠϯϝϞϦ ?? •

    ֎෦αʔϏεͱͷ௨৴ํ๏ͷৄࡉ … http/websocket/grpc/graphql ͳͲ • ϑΝΠϧΛอଘ͢ΔετϨʔδͷछྨʢϩʔΧϧ or S3?? σʔλϑΥʔϚο τͷ࢓༷͸? ͳͲʣ
  9. FAQ? xxx-local γϦʔζͱ͔ɺlocalstackͬͯͲ͏ͳΜʁ • ʢݸਓతҙݟʣ૯ධͱͯ͠͸ɺςετ༻్ͱͯ͠ݟΔͳΒΠϚΠνɻͲ͏ͯ͠΋ඞཁͳཧ༝͕ग़ͨ ͱ͖ʹ͚ͩݕ౼͢΂͖ → YAGNI ͷݪଇɻʮૣ͗ͨ͢࠷దԽʯʹؕͬͯ͸͍͚ͳ͍ •

    localstack Λςετͷखஈͱͯ͠Ξςʹ͗͢͠Δͱ… • ςετ͸ຊ൪ίʔυͷҰ෦ͳͷͰɺߏ੒͕มΘͬͨΒ localstack ΋௥ਵ͢Δඞཁ͕͋Δ • localstack ͷҡ࣋؅ཧ͕อकίετʹͳͬͯ͠·͏ʢͦͯ͠ϝϯς͞Εͳ͍ෛ࠴ίʔυ΁ʣ
  10. FAQ? xxx-local γϦʔζͱ͔ɺlocalstackͬͯͲ͏ͳΜʁ • dynamodb-local • ख͔࣮ܰͭࡍʹΞΫηεͰ͖Δಈ࡞ݕূ؀ڥͱͯ͠͸ΞϦɻFunctional Test ʹ͸࢖͑Δ͔΋ʁ •

    ݸਓతʹ͸ΫΤϦܗࣜΛಈ࡞ݕূ͢Δͱ͖ʹ͋ͬͨΒ͍͍ఔ౓ɻσʔλͷग़͠ೖΕΛ൐͏ؔ਺ͷ ςετͰ͋Ε͹ɺී௨ʹMockͰ΋ࣄ଍ΓΔ • εΩʔϚมΘͬͯ΋ςετͷҰ؏ੑΛอ͍ͪͨͳΒ…ͨͩɺεΩʔϚมߋ͸DB૊Έ௚͔͠ʢLSI/ GSI௥ՃͷΈͰʣطଘΫΤϦʹӨڹͳͩ͠ͱࢥ͏ͷͰɺҡ࣋ͷखؒʹݟ߹͏ͱ͸ߟ͑ͯͳ͍
  11. FAQ? xxx-local γϦʔζͱ͔ɺlocalstackͬͯͲ͏ͳΜʁ • localstack • ※࢖ͬͨ͜ͱͳ͍ͷͰͳΜͱͳ͘ͷҹ৅Λճ౴͠·͢ • ϩʔΧϧͰͷݕূʢvalidateͰ͸ͳ͘ɺPoCతͳҙຯͷํʣʹ࢖͏΋ͷɺͱ͍͏ఔ౓ •

    ςετ͸ຊ൪ίʔυͷҰ෦ͳͷͰɺίʔυͷมߋʹ൐͍ localstack ΋ҡ࣋؅ཧ͕ඞཁʹͳΔɻ
 Ҿ͖ܧ͗ίετɾอकίετ্͕͕Δ͕ɺͦΕʹݟ߹͏΄ͲͷϝϦοτ͕͋·Γݟ͍ͩͤͳ͍ҹ৅
  12. ςετΛࢧԉ͢Δύοέʔδ (1/2) • tmpfile … Pythonඪ४ύοέʔδɻϑΝΠϧͷI/OΛςετ͢Δඞཁ͕͋Δ৔߹ʹɺςετதͷΈ࢖ ༻͢ΔҰ࣌తͳϑΝΠϧ/σΟϨΫτϦΛ࡞ΕΔ • nose …

    unittestΛ΋ͬͱศརʹ͢Δ΍ͭ • pytest … unittestΛ΋ͬͱศརʹ͢Δ΍ͭ • coverage … ΧόϨοδϨϙʔτͷੜ੒ (nose, pytest ͳͲʹϓϥάΠϯՄೳ) • tox … ෳ਺όʔδϣϯͷPythonͰςετΛ࣮ࢪ͢Δͱ͖ʹ࢖͏
  13. ςετΛࢧԉ͢Δύοέʔδ (2/2) • httpretty … ੜͷHTTPϦΫΤετΛϞοΫ͢Δʢ࣮૷ྫʣ • moto … boto3

    ༻ͷMockʢBatchWriterͳͲҰ෦ඇରԠ͋Γʣ • aws sam cli … Lambda ͷ event Ҿ਺ͷαϯϓϧೖྗΛखૣ͘ੜ੒͢Δͷʹ࢖͑Δ • serverless-dynamodb-local … Serverless ϓϥάΠϯɻDynamoDB ͷϩʔΧϧಈ࡞ݕূʹศར
  14. See Also • Python document: unittest —- ϢχοτςετϑϨʔϜϫʔΫ • ςετۦಈ։ൃ

    • CAREER SKILLSɹιϑτ΢ΣΞ։ൃऀͷ׬શΩϟϦΞΨΠυ • ୈ29ষ ςετۦಈ։ൃͱϢχοτςετ • ୈ32ষ σόοά