Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
ちゃんと実装してちゃんとテストしよう / PyCon mini Hiroshima 2019
Search
7pairs
October 12, 2019
Technology
1.1k
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
ちゃんと実装してちゃんとテストしよう / PyCon mini Hiroshima 2019
7pairs
October 12, 2019
More Decks by 7pairs
See All by 7pairs
Pythonによる契約プログラミング入門 / PyCon JP 2025
7pairs
7
4.8k
Privacy Sandbox on Android / DroidKaigi 2024
7pairs
1
1.2k
テキストマイニングによるプロ野球の順位予想 / Baseball Play Study 2020 Winter
7pairs
0
590
2020年の振り返りとBaseball Play Studyの振り返り / Jisyupy 29
7pairs
0
410
Because Python is there. / Jisyupy 27
7pairs
0
540
野球好きのための快適なプレゼンテーション環境の構築 / Baseball Play Study 2019 Winter
7pairs
0
1.1k
Pie Meets Py / PyCon JP 2019
7pairs
3
6k
テキストマイニングによる新外国人選手の分析 / Baseball Play Study 2019 Spring
7pairs
0
3.1k
テキストマイニングによる応援歌の分析 / Baseball Play Study 2018 Winter
7pairs
0
2.4k
Other Decks in Technology
See All in Technology
SDDの運用にめげずに向き合った話
sansantech
PRO
1
140
MCPゲートウェイを作って運用してわかったこと — Agent時代の権限管理の現在地
mtpooh
10
3.2k
AI時代のAPI開発を加速する品質ガードレール / API Quality Guardrails in the AI Era
yokawasa
0
170
Deep Data Security 機能解説
oracle4engineer
PRO
2
740
不可逆な意思決定を避けながら10億超の顧客データを AI Ready にするデータ基盤設計
baseballyama
1
230
自律型 AI をセキュアに実装!Gemini と MIG で作る動的コード実行環境
recruitengineers
PRO
1
230
おそらく日本で唯一のDevRelインターン生として
husengs7
0
170
Snapshot Testing in Practice: Predictable and Reliable SwiftUI Views
fespinoza
0
160
Kiro Crewをはじめよう
kizawa2020
1
110
Cognition AI Japan - ウェビナー2_テストQA_運用監視
cogakira
0
110
生成AIを使って「人が」考える技術 ― AI時代の人機共想と実践ノウハウ|UNITT AC2026
ishiirikie
0
570
分析の民主化を支えるメタデータ整備の実践
kakehashi
PRO
4
1.2k
Featured
See All Featured
Embracing the Ebb and Flow
colly
88
5.2k
We Have a Design System, Now What?
morganepeng
55
8.4k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.6k
How STYLIGHT went responsive
nonsquared
100
6.3k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
400
Into the Great Unknown - MozCon
thekraken
41
2.8k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
52
6.1k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
970
The Cult of Friendly URLs
andyhume
79
7k
The innovator’s Mindset - Leading Through an Era of Exponential Change - McGill University 2025
jdejongh
PRO
1
370
Darren the Foodie - Storyboard
khoart
PRO
4
4k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
2
350
Transcript
ͪΌΜͱ࣮ͯ͠ ͪΌΜͱςετ͠Α͏ 2019-10-12 (PyCon mini Hiroshima 2019) ୩ ५
ࣗݾհ • ୩ ५ (ͤ ͡ΎΜ) • ֤छSNSͰ 7pairs Ͱ׆ಈத
• ͖ͳେࡕۅӂதଜ߶ / ͖ͳ࢜େֶ֎࡚मଡ • ͓ࣄͰAndroid (Java / Kotlin) / iOS (Objective-C / Swift) ͕த৺ • ͋·ΓҰൠతͱݴ͑ͳ͍Pythonͷ͍ํΛࡧ͢Δͷ͕େ͖ • PyCon JPͰAltJS (2018) / Android (2019) ʹ͍ͭͯൃද • https://speakerdeck.com/7pairs
ౡͰͷొஃ (4ͿΓ2ճ) • ৽ਓڭҭͱPython (2015) • https://speakerdeck.com/7pairs/pycon-mini- hiroshima-2015 • ͪΌΜͱ࣮ͯͪ͠ΌΜͱςετ͠Α͏
(←New!) • https://speakerdeck.com/7pairs/pycon-mini- hiroshima-2019
ஶॻ Chalice, Transcrypt, pytest, SeleneΛར༻ͯ͠ αʔόʔϨεΞϓϦΛ࣮ɾςετ͢ΔຊͰ͢ AmazonଞͰઈࢍൢചதʂ
͜ͷηογϣϯͰ͢͜ͱ • ͪΌΜͱςετ͢ΔͱͲ͏͍͏͜ͱ͔ʁ • ͪΌΜͱςετ͢ΔͨΊʹ Ͳ͏࣮͖͔͢ʁ
͜ͷηογϣϯͰ͞ͳ͍͜ͱ • ݸผͷςετπʔϧͷৄࡉʹ͍ͭͯ • ݸผͷCI / CDπʔϧͷৄࡉʹ͍ͭͯ
͜ͷηογϣϯͷΰʔϧ • ιϑτΣΞςετʹ͍ͭͯ ཧղ͍ͯͨͩ͘͠ • ࣭ʹର͢ΔҙࣝΛߴΊ͍ͯͨͩ͘ • ࠙ձͰࢲ͕΅ͬͪʹͳΒͳ͍
ձͷΈͳ͞·ʹ࣭Ͱ͢
ීஈςετΛ͍ͯ͠ͳ͍ํ
None
ීஈςετΛ͍ͯ͠Δํ
͋ͳͨͷ͍ͬͯΔ͜ͱ ຊʹςετͳͷͰ͠ΐ͏͔ʁ
ςετͱ
ςετ (Testing) શͯͷϥΠϑαΠΫϧΛ௨࣮ͯ͡ࢪ͢Δ੩తɺಈ తͳϓϩηεʹ͓͍ͯɺՌ͕ಛఆͷཁ݅Λຬ ͢Δ͔Λఆ͠ɺతʹ߹க͢Δ͜ͱΛ࣮ূ ͠ɺܽؕΛݟ͚ͭΔͨΊɺιϑτΣΞϓϩμΫ τؔ࿈Ռʹର͠ɺܭըɺ४උɺධՁΛ͢Δ ͜ͱɻ ——ʰISTQBιϑτΣΞςετඪ४༻ޠू (ຊޠ൛)ʱΑΓ
ͪΌΜͱత͕Ռ͍ͨͤͯΔ͔ʁ • ςετίʔυΛॻ͍͔ͨΒͱ͍ͬͯ ඞͣͦ͠Ε͕ςετʹͳΔΘ͚Ͱͳ͍ • ը໘Λૢ࡞ͯ͠ಈ࡞Λ֬ೝ͔ͨ͠Βͱ͍ͬͯ ඞͣͦ͠Ε͕ςετʹͳΔΘ͚Ͱͳ͍
ςετϨϕϧ
ςετϨϕϧ (Test level) ܥ౷తʹ·ͱΊɺཧ͍ͯ͘͠ςετͷ׆ಈͷ άϧʔϓɻ֤ςετϨϕϧϓϩδΣΫτͷಛఆ ͷͱରԠ͚͕Ͱ͖ΔɻςετϨϕϧͷྫ ʹɺίϯϙʔωϯτςετɺ౷߹ςετɺγ εςϜςετɺड͚ೖΕςετ͕͋Δɻ ——ʰISTQBιϑτΣΞςετඪ४༻ޠू (ຊޠ൛)ʱΑΓ
VࣈϞσϧ
ίϯϙʔωϯτςετ (Component testing) • ݸʑͷιϑτΣΞίϯϙʔωϯτͷςετɻ (ISTQB༻ޠू) • Ϣχοτςετ /
୯ମςετͱ ݺΕΔ͜ͱ͕ଟ͍ • ίʔυͷ։ൃ୲ऀ͕ߦ͏͜ͱ͕Ұൠత
౷߹ςετ (Integration testing) • ౷߹ͨ͠ίϯϙʔωϯτγεςϜͷ ΠϯλʔϑΣʔε૬ޓ࡞༻ͷܽؕΛ ఠग़͢ΔͨΊͷςετɻ (ISTQB༻ޠू)
• ݸʑͷίϯϙʔωϯτͷػೳͰͳ͘ ίϯϙʔωϯτؒͷίϛϡχέʔγϣϯʹ যΛͯΔඞཁ͕͋Δ
γεςϜςετ (System testing) • ౷߹͞ΕͨγεςϜ͕ɺಛఆͷཁ݅Λ ຬͨ͢͜ͱΛ࣮ূ͢ΔͨΊͷςετͷ ϓϩηεɻ (ISTQB༻ޠू)
• ΤϯυπʔΤϯυͷશମͷৼΔ͍Λ֬ೝ͢Δ • ػೳͱඇػೳͷ྆ํΛ֬ೝ͢Δ
ड͚ೖΕςετ (Acceptance testing) • γεςϜ͕ɺϢʔβͷχʔζɺཁ݅ɺ ϏδωεɾϓϩηεΛຬ͢Δ͔ΛνΣοΫ ͢ΔͨΊͷެࣜͳςετɻ (ISTQB༻ޠू)
• ϢʔβʔʹΑͬͯߦΘΕΔ͜ͱ͕ଟ͍ • ຊ൪ڥ·ͨͦΕʹ͍ۙڥͰߦ͏
ΞδϟΠϧ։ൃʹ ͜ͷϞσϧͯ·Βͳ͍ͷͰ
None
ΞδϟΠϧͩͬͯมΘΒͳ͍ • ܭըΑΓมԽͷదԠʹॏ͖Λஔ͖ υΩϡϝϯτΑΓಈ͘ίʔυΛॏࢹ͢Δ͕ ઃܭΛ͠ͳ͍։ൃख๏Ͱͳ͍ • ҰճͷΠςϨʔγϣϯͷதͰ
VࣈϞσϧʹ͍ۙܗ͕Ͱ͖͕͋Δͣ
ಈతςετ / ੩తςετ
ಈతςετ (Dynamic testing) ίϯϙʔωϯτγεςϜͷιϑτΣΞΛ࣮ ߦͤͯ֬͞ೝ͢Δςετɻ ——ʰISTQBιϑτΣΞςετඪ४༻ޠू (ຊޠ൛)ʱΑΓ
੩తςετ (Static testing) ιϑτΣΞ։ൃͷՌ (ཁ݅ɺઃܭɺຢɺ ίʔυͳͲ) ͷ࣮ߦΛͤͣʹ࣮ࢪ͢ΔՌͷς ετɻͨͱ͑ɺϨϏϡʔɺ੩తղੳͳͲɻ ——ʰISTQBιϑτΣΞςετඪ४༻ޠू (ຊޠ൛)ʱΑΓ
੩తςετͷྫ • ੩తղੳπʔϧΛར༻ͯ͠ ιʔείʔυΛධՁ͢Δ • ઃܭॻΛ࡞ऀͱผͷਓ͕ؒϨϏϡʔ͠ ޡΓͷࢦఠɺվળͷఏҊΛߦ͏ •
ιʔείʔυΛ࡞ऀͱผͷਓ͕ؒϨϏϡʔ͠ ޡΓͷࢦఠɺվળͷఏҊΛߦ͏
੩తςετͷಛ • ϓϩάϥϜΛಈ͔͢ඞཁ͕ͳ͍ͨΊ ૣ͍ஈ֊Ͱߦ͏͜ͱ͕Ͱ͖Δ • อकੑʹؔ͢Δܽؕ (Մಡੑɺ࠶ར༻ੑ) ͷ
ݕग़͕Ͱ͖Δ • ܽؕʹΑͬͯҾ͖ى͜͞ΕͨނোͰͳ͘ ܽؕͦͷͷΛݕग़͢Δ
ͱ͜ΖͰ͓ؾ͖ͮʹͳΓ·͔ͨ͠ʁ
PyCon miniͳͷʹPython͕ ग़͖͍ͯͯͳ͍ͷͰ
None
ͪΌΜͱ࣮͢Δ
ςελϒϧͳ࣮Λ৺͕͚Δ • ςετΛҙ࣮ࣝͯ͢͠Δ • ଞͷηΦϦʔͱ૬͢Δ͜ͱ͋Δ • ઃܭ͕ʹͳΔՄೳੑ͕͋Δ • PythonicͰͳ͍࣮ʹͳΔՄೳੑ͕͋Δ
ঢ়گʹΑͬͯมԽ͢Δ ֎෦͔Βड͚औΔ
վળલ import datetime # 結果が実行タイミングに依存する def is_saturday(): today = datetime.date.today()
return today.weekday() == 5 if is_saturday(): print('Hello, PyCon mini Hiroshima!')
վળޙ import datetime # 同じ引数を渡せば同じ結果が返る def is_saturday(target): return target.weekday() ==
5 if is_saturday(datetime.date.today()): print('Hello, PyCon mini Hiroshima!')
ґଘੑΛ֎෦͔Βೖ͢Δ
վળલ class Weather: def __init__(self): self._api = WeatherApi() # テストを実施するたびに
# APIへのアクセスが発生する def get_celsius(self): return self._api.get_celsius()
վળޙ class Weather: def __init__(self, api): self._api = api #
テストを実施するたびに # 引数で渡されたオブジェクトへの # アクセスが発生する def get_celsius(self): return self._api.get_celsius()
ελϒ / ϞοΫ͕ར༻Մೳʹ import unittest class DummyWeatherApi(WeatherApi): def get_celsius(self): return
33.4 class SampleTest(unittest.TestCase): def test_sample(self): weather = Weather(DummyWeatherApi()) # get_celsiusに対するテストを実施
ͪΌΜͱςετ͢Δ
ԿΛ୲อ͍ͨ͠ͷ͔໌֬ʹ͢Δ • Must / Want / NeverʹԊͬͨ֬ೝΛ͢Δ • MustɿͰ͖ͳ͚Ε͍͚ͳ͍͜ͱ •
WantɿͰ͖͍ͯΔͱخ͍͜͠ͱ • Neverɿى͍͚ͬͯ͜ͳ͍͜ͱ
ڥքΛҙࣝͯ͠ςετ͢Δ • ೖྗͷڥքͷલޙͷͰςετ͢Δ • ίϯϙʔωϯτςετͷجຊͱͳΔٕ๏ • ࣗવͱΧόϨοδ্͕͕Δͣ
ϒϥοΫϘοΫεςετඞཁ • ౷߹ςετҎ߱ͷςετͰ ϒϥοΫϘοΫεςετ͕த৺ͱͳΔ • ςετରͷೖྗͱग़ྗʹண͠ ෦ߏͷৄࡉҙࣝ͠ͳ͍
ϋοϐʔύεΛҙࣝ͢Δ • ϋοϐʔύεͷςετ͚ͩͰࠔΔ͕ γεςϜͷྲྀΕΛ͏ʹ༗༻ • γεςϜςετͷϋοϐʔύε యܕతͳϢʔεέʔεʹͳΔ
؍࿙ΕΛ͙ͨΊʹ • ͋ͳͨͷίʔυ͕ɺࣗͷݴ༿Λ͞ͳ͍ਓʹ ಡ·Εͳ͍ͱ֬৴͍ͯ͠ͳ͚ΕɺίϝϯτΛ ӳޠͰॻ͘Α͏ʹ͓ئ͍͠·͢ɻ (PEP 8ΑΓ) • ͋ͳͨͷςετίʔυ͕ɺӳޠͰࢥߟͰ͖Δਓ ʹ͔͠ಡ·Εͳ͍ͱ֬৴͍ͯ͠ͳ͚Εɺςε
τϝιου໊ΛຊޠͰॻ͘Α͏ʹ͓ئ͍͠· ͢ɻ (ॾઆ͋Γ·͢)
Python 2໊ؔʹ ASCII͔͑͠ͳ͍ͷͰ
None
ࣗಈςετ
ࣗಈςετʹ͍ͭͯ • աڈͷPyCon JPͰ ૉΒ͍͠ൃද͕ͨ͘͞Μ͋Γ·͢ • https://www.youtube.com/user/PyConJP/ search?query=ςετ
ςετϐϥϛου
ιϑτΣΞςετͷ7ݪଇ
1. ςετ͕ܽؕ͋Δ͜ͱࣔͤΔ͕ ͕ܽؕͳ͍͜ͱࣔͤͳ͍ • ιϑτΣΞʹނো͕ݟ͔ͭͬͨ߹ • ͦͷιϑτΣΞʹ͕ܽؕ͋Δ • ιϑτΣΞʹނো͕ݟ͔ͭΒͳ͔ͬͨ߹ •
ͦͷιϑτΣΞʹ͕ܽؕͳ͍ͱݶΒͳ͍ • ࣮ࢪͨ͠ςετͰͨ·ͨ· ܽؕΛݟ͚ͭΒΕͳ͔͚͔ͬͨͩ͠Εͳ͍
2. શςετෆՄೳ • ͯ͢ͷೖྗͱͯ͢ͷ݅ͷΈ߹Θͤ ແʹଘࡏ͢Δ • ༗ݶͷ࣌ؒͰͯ͢ͷύλʔϯΛ ςετ͢Δ͜ͱෆՄೳ
• ςετൣғΛॏཁͳॴʹߜΔ • ςετʹ༏ઌॱҐΛ͚ͭΔ
3. ૣظςετͰ࣌ؒͱίετΛઅ • ܽؕΛݟ͚ͭΔͷ͕͘ͳΔ΄Ͳ मਖ਼ͷίετ͕େ͖͘ͳΔ • ݪҼͷಛఆʹ͕͔͔࣌ؒΔ • ผͷػೳ͔Βࢀর͞Ε͍ͯͯमਖ਼ͮ͠Β͍
• ܽؕΛૣ͘ݟ͚ͭΔͨΊ ։ൃαΠΫϧͷૣ͍࣌ظʹςετΛߦ͏
4. ܽؕͷภࡏ • ιϑτΣΞͷͯ͢ͷػೳ͕ ಉ͡Α͏ʹ࡞ΒΕ͍ͯΔΘ͚Ͱͳ͍ • ઃܭ࣮ͷқ͕ҧ͏ • ࿈ܞ͕ඞཁͳ֎෦ͱͷΠϯλʔϑΣΠε͕ҧ͏
• ܽؕۉҰʹͤͣʹಛఆͷػೳʹूத͍͢͠ • ύϨʔτͷ๏ଇ
5. ࡴࡎͷύϥυοΫεʹ͝༻৺ • ಉ͡ιϑτΣΞʹରͯ͠ಉ͡ςετΛ ܁Γฦ͍ͯ͠Δͱ͍ͣΕܽؕΛൃݟͰ͖ͳ͘ͳΔ • ఆظతʹςετͷมߋՃΛߦ͏ • ͨͩ͠ϦάϨογϣϯςετͰ
ಉ͡ςετΛ܁Γฦ͢͜ͱ͕༗༻
6. ςετঢ়گ࣍ୈ • ιϑτΣΞͷੑ࣭ʹΑͬͯ ॏతʹςετ͢Δ༰͕มΘͬͯ͘Δ • μϯͯ͠ࠔΔγεςϜͳͷͰ ෛՙςετΛॏతʹߦ͏
• ͓ۚΛѻ͏γεςϜͳͷͰ ηΩϡϦςΟपΓΛॏతʹςετ͢Δ • ͦͷػೳ͕ଘࡏ͠ͳ͍͜ͱ͕Ϗδωε্ͷϦεΫͳͷͰ ςετͷ࣌ؒΛΊʹͯ͠ϦϦʔεͯ͠͠·͏
7. ʮόάθϩʯͷམͱ݀͠ • పఈతʹςετΛ࣮ࢪͯ͠ ͕ܽؕݟ͔ͭΒͳ͘ͳͬͯ ͦΕͰ100ͷιϑτΣΞʹͳΔΘ͚Ͱͳ͍ • ͍ʹ͍͘γεςϜ
• ϢʔβʔͷχʔζΛຬͨ͞ͳ͍γεςϜ
͞Βʹਂֶ͘ͿͨΊʹ
ςελʔͪΌΜ ৽ਓ͞Μ͔ΒΘ͔Δ ιϑτΣΞςετղઆϚϯΨ ιϑτΣΞςετͷجૅΛ ອըͰ͔Γ͘͢ղઆ Webອը / ಉਓࢽ
/ Kindle
ॳΊͯͷࣗಈςετ ࣗಈςετͷߟ͑ํͱϑϨʔϜϫʔΫΛ 1͔Βղઆʂ (ॻ੶ଳΑΓ) WebγεςϜͷࣗಈςετΛࡐʹ ߟ͑ํϑϨʔϜϫʔΫʹ͍ͭͯղઆ Jonathan Rasmusson
ஶ / ۄ ߛࢠ ༁ (ΦϥΠϦʔδϟύϯ)
ϚΠϯυϚοϓ͔Β࢝ΊΔιϑτΣΞςετ ؍Λ͠ɺ͛ɺਂΊΔ (ॻ੶ଳΑΓ) ϚΠϯυϚοϓΛ༻ͨ͠ ςετͷܭըɺઃܭɺใࠂͳͲͷख๏Λ ࣮ྫͱͱʹ͔Γ͘͢ղઆ ా ڿ,
ླ ࡾل ஶ (ٕज़ධࣾ)
ςετۦಈPython pytestΛͬͯPythonͰ ςετۦಈ։ൃ͢ΔͨΊͷશࣝ (දࢴΑΓ) pytestΛར༻ͨ͠ςετͷॻ͖ํ ςετۦಈ։ൃͷਐΊํΛղઆ Brian Okken
ஶ / ҆Ҫ ྗ म גࣜձࣾΫΠʔϓ ༁ (ᠳӭࣾ)
·ͱΊ
·ͱΊ • ίϯϙʔωϯτςετ͚͕ͩςετͰͳ͍ • ࣭ͷͨΊʹҙࣝ͢Δͱ͜Ζͨ͘͞Μ͋Δ • ͨΓલͷ͜ͱΛͨΓલʹΖ͏ • ςετ࣮ͷޙఔͰͳ͍
ςετʹ͍ͭͯཧղͰ͖·͔ͨ͠ʁ
None
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠