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
860
ちゃんと実装してちゃんとテストしよう / 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
260
テキストマイニングによるプロ野球の順位予想 / Baseball Play Study 2020 Winter
7pairs
0
480
2020年の振り返りとBaseball Play Studyの振り返り / Jisyupy 29
7pairs
0
310
Because Python is there. / Jisyupy 27
7pairs
0
420
野球好きのための快適なプレゼンテーション環境の構築 / Baseball Play Study 2019 Winter
7pairs
0
1k
Pie Meets Py / PyCon JP 2019
7pairs
3
5.3k
テキストマイニングによる新外国人選手の分析 / Baseball Play Study 2019 Spring
7pairs
0
2.7k
テキストマイニングによる応援歌の分析 / Baseball Play Study 2018 Winter
7pairs
0
2.2k
altJSとしてのPython / PyCon JP 2018
7pairs
2
2.6k
Other Decks in Technology
See All in Technology
JTCや セキュリティチェックリストが夢の跡
nikinusu
0
440
DuckDB雑紹介(1.1対応版)@DuckDB座談会
ktz
6
1.4k
SORACOMで実現するIoTのマルチクラウド対応 - IoTでのクリーンアーキテクチャの実現 -
kenichirokimura
0
390
テスト”ケース”駆動開発 で手戻りをなくそう
ryohma0510
0
310
プロダクトエンジニアを支えるための開発生産性向上施策
tsukakei
0
140
持続可能なソフトウェア開発を支える『GitHub CI/CD実践ガイド』
tmknom
6
1.3k
OSTという文化を組織に根付かせてみた
sansantech
PRO
2
360
たった1人からはじめる【Agile Community of Practice】~ソース原理とFearless Changeを添えて~
ktc_corporate_it
1
470
eBPFのこれまでとこれから
yutarohayakawa
10
3.2k
リアルお遍路+SORACOM IoT
ozk009
1
140
2024年のナビゲーション・フォーカス対応:Composeでキーボード・ナビゲーションをサポートしよう
tahia910
0
110
20240911_New_Relicダッシュボード活用例
speakerdeckfk
0
110
Featured
See All Featured
CoffeeScript is Beautiful & I Never Want to Write Plain JavaScript Again
sstephenson
157
15k
What's new in Ruby 2.0
geeforr
340
31k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Pencils Down: Stop Designing & Start Developing
hursman
119
11k
Docker and Python
trallard
39
3k
How to train your dragon (web standard)
notwaldorf
85
5.6k
GraphQLとの向き合い方2022年版
quramy
43
13k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
36
2.1k
The Cult of Friendly URLs
andyhume
76
6k
Practical Orchestrator
shlominoach
185
10k
The Invisible Customer
myddelton
119
13k
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
28
1.6k
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
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠