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
1k
ちゃんと実装してちゃんとテストしよう / PyCon mini Hiroshima 2019
7pairs
October 12, 2019
Tweet
Share
More Decks by 7pairs
See All by 7pairs
Pythonによる契約プログラミング入門 / PyCon JP 2025
7pairs
6
2.5k
Privacy Sandbox on Android / DroidKaigi 2024
7pairs
1
940
テキストマイニングによるプロ野球の順位予想 / Baseball Play Study 2020 Winter
7pairs
0
530
2020年の振り返りとBaseball Play Studyの振り返り / Jisyupy 29
7pairs
0
340
Because Python is there. / Jisyupy 27
7pairs
0
490
野球好きのための快適なプレゼンテーション環境の構築 / Baseball Play Study 2019 Winter
7pairs
0
1.1k
Pie Meets Py / PyCon JP 2019
7pairs
3
5.6k
テキストマイニングによる新外国人選手の分析 / Baseball Play Study 2019 Spring
7pairs
0
2.9k
テキストマイニングによる応援歌の分析 / Baseball Play Study 2018 Winter
7pairs
0
2.3k
Other Decks in Technology
See All in Technology
LLMアプリケーション開発におけるセキュリティリスクと対策 / LLM Application Security
flatt_security
7
1.8k
Trust as Infrastructure
bcantrill
0
330
SoccerNet GSRの紹介と技術応用:選手視点映像を提供するサッカー作戦盤ツール
mixi_engineers
PRO
1
170
SREとソフトウェア開発者の合同チームはどのようにS3のコストを削減したか?
muziyoshiz
1
100
Flaky Testへの現実解をGoのプロポーザルから考える | Go Conference 2025
upamune
1
420
Pure Goで体験するWasmの未来
askua
1
180
Why Governance Matters: The Key to Reducing Risk Without Slowing Down
sarahjwells
0
110
10年の共創が示す、これからの開発者と企業の関係 ~ Crossroad
soracom
PRO
1
170
Function calling機能をPLaMo2に実装するには / PFN LLMセミナー
pfn
PRO
0
920
pprof vs runtime/trace (FlightRecorder)
task4233
0
160
それでも私はContextに値を詰めたい | Go Conference 2025 / go conference 2025 fill context
budougumi0617
4
1.2k
GA technologiesでのAI-Readyの取り組み@DataOps Night
yuto16
0
270
Featured
See All Featured
The Cult of Friendly URLs
andyhume
79
6.6k
Building an army of robots
kneath
306
46k
Statistics for Hackers
jakevdp
799
220k
The Cost Of JavaScript in 2023
addyosmani
53
9k
What's in a price? How to price your products and services
michaelherold
246
12k
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
12
1.2k
[RailsConf 2023] Rails as a piece of cake
palkan
57
5.9k
GitHub's CSS Performance
jonrohan
1032
460k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Context Engineering - Making Every Token Count
addyosmani
5
180
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
15
1.7k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
54
3k
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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠