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
2
940
ちゃんと実装してちゃんとテストしよう / PyCon mini Hiroshima 2019
7pairs
October 12, 2019
Tweet
Share
More Decks by 7pairs
See All by 7pairs
Privacy Sandbox on Android / DroidKaigi 2024
7pairs
1
740
テキストマイニングによるプロ野球の順位予想 / Baseball Play Study 2020 Winter
7pairs
0
500
2020年の振り返りとBaseball Play Studyの振り返り / Jisyupy 29
7pairs
0
320
Because Python is there. / Jisyupy 27
7pairs
0
460
野球好きのための快適なプレゼンテーション環境の構築 / Baseball Play Study 2019 Winter
7pairs
0
1k
Pie Meets Py / PyCon JP 2019
7pairs
3
5.5k
テキストマイニングによる新外国人選手の分析 / Baseball Play Study 2019 Spring
7pairs
0
2.8k
テキストマイニングによる応援歌の分析 / Baseball Play Study 2018 Winter
7pairs
0
2.2k
altJSとしてのPython / PyCon JP 2018
7pairs
2
2.7k
Other Decks in Technology
See All in Technology
AIエージェント開発手法と業務導入のプラクティス
ykosaka
3
1.5k
ソフトウェア開発現代史: "LeanとDevOpsの科学"の「科学」とは何か? - DORA Report 10年の変遷を追って - #DevOpsDaysTokyo
takabow
0
390
Рекомендации с нуля: как мы в Lamoda превратили главную страницу в ключевую точку входа для персонализированного шоппинга. Данил Комаров, Data Scientist, Lamoda Tech
lamodatech
0
750
ドキュメント管理の理想と現実
kazuhe
1
210
ワールドカフェI /チューターを改良する / World Café I and Improving the Tutors
ks91
PRO
0
120
白金鉱業Meetup_Vol.18_AIエージェント時代のUI/UX設計
brainpadpr
1
150
LiteXとオレオレCPUで作る自作SoC奮闘記
msyksphinz
0
710
クォータ監視、AWS Organizations環境でも楽勝です✌️
iwamot
PRO
1
320
Would you THINK such a demonstration interesting ?
shumpei3
1
220
エンジニアリングで組織のアウトカムを最速で最大化する!
ham0215
1
110
DuckDB MCPサーバーを使ってAWSコストを分析させてみた / AWS cost analysis with DuckDB MCP server
masahirokawahara
0
1.3k
地味にいろいろあった! 2025春のAmazon Bedrockアップデートおさらい
minorun365
PRO
1
270
Featured
See All Featured
Six Lessons from altMBA
skipperchong
27
3.7k
How GitHub (no longer) Works
holman
314
140k
Designing for Performance
lara
608
69k
JavaScript: Past, Present, and Future - NDC Porto 2020
reverentgeek
47
5.3k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
5
530
Site-Speed That Sticks
csswizardry
5
500
Building Adaptive Systems
keathley
41
2.5k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
34
2.9k
The Pragmatic Product Professional
lauravandoore
33
6.5k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
4 Signs Your Business is Dying
shpigford
183
22k
Imperfection Machines: The Place of Print at Facebook
scottboms
267
13k
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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠