Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ちゃんと実装してちゃんとテストしよう / 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.5k
Privacy Sandbox on Android / DroidKaigi 2024
7pairs
1
1.1k
テキストマイニングによるプロ野球の順位予想 / Baseball Play Study 2020 Winter
7pairs
0
570
2020年の振り返りとBaseball Play Studyの振り返り / Jisyupy 29
7pairs
0
390
Because Python is there. / Jisyupy 27
7pairs
0
530
野球好きのための快適なプレゼンテーション環境の構築 / Baseball Play Study 2019 Winter
7pairs
0
1.1k
Pie Meets Py / PyCon JP 2019
7pairs
3
5.9k
テキストマイニングによる新外国人選手の分析 / 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
reFACToring
moznion
1
860
全社でのソフトウェアサプライチェーン攻撃対策をやってみた with Takumi Guard
z63d
0
320
ここは地獄!つらい朝会を体験することで、チームとしてのより良い振る舞いに気づくワークショップ / The stand-up meeting from hell in the game industry
scrummasudar
0
430
『モンスターストライク』 の運営に伴走する! データ民主化への 解析グループの3つのアプローチ
mixi_engineers
PRO
0
170
事業成長とAI活用を止めないデータ基盤アーキテクチャの設計思想
hiracky16
0
770
WEBフロントエンド研修【MIXI 26新卒技術研修】
mixi_engineers
PRO
1
720
最新IoT事例11選に学ぶ!現場の成功パターンと実践のコツ【SORACOM Discovery 2026】
soracom
PRO
0
120
MCPをつなげて作る組織横断のAIエージェント基盤
tsubakimoto_s
0
280
AI エージェント時代のデジタルアイデンティティ
fujie
1
1.1k
ダッシュボード"開発"について 〜使われるダッシュボードのつくりかた〜
kimichan
0
240
BigQuery を検索ソースとした AI Agent の作り方って 〇〇 通りあんねん
satohjohn
0
140
実践が先生だった— 新卒サーバーエンジニア1年目のリアル
mixi_engineers
PRO
0
200
Featured
See All Featured
A brief & incomplete history of UX Design for the World Wide Web: 1989–2019
jct
2
430
Building Adaptive Systems
keathley
44
3.1k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
Joys of Absence: A Defence of Solitary Play
codingconduct
1
420
[SF Ruby Conf 2025] Rails X
palkan
2
1.2k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
Designing for Performance
lara
611
70k
The Mindset for Success: Future Career Progression
greggifford
PRO
0
430
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.8k
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.7k
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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠