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
テストと仲良くなりたい、 なりたくない? -why test
Search
hideki kinjyo
PRO
April 16, 2021
Programming
0
76
テストと仲良くなりたい、 なりたくない? -why test
社内勉強会での発表ネタです
hideki kinjyo
PRO
April 16, 2021
Tweet
Share
More Decks by hideki kinjyo
See All by hideki kinjyo
もう少しテストを書きたいんじゃ〜 #phpstudy
o0h
PRO
17
4.1k
『テスト書いた方が開発が早いじゃん』を解き明かす #phpcon_nagoya
o0h
PRO
8
2.5k
色んなオートローダーを覗き見る #phpcon_okinawa
o0h
PRO
5
570
ヒューマンエラーの本を読んだ ~報告会~
o0h
PRO
3
290
みんなでワイワイ「テスト駆動開発」の話をやる会 #techramen24conf
o0h
PRO
4
570
SPLから始める「データ構造」入門
o0h
PRO
7
1.9k
PHPUnit11の新しい仲間たち
o0h
PRO
3
430
単体テストを書かない技術 #phpcon_odawara
o0h
PRO
62
21k
パンフ記事 「初めてのリファクタリング!」 の裏側 #phperkaigi
o0h
PRO
2
180
Other Decks in Programming
See All in Programming
SwiftUI Viewの責務分離
elmetal
PRO
2
270
AIの力でお手軽Chrome拡張機能作り
taiseiue
0
190
「個人開発マネタイズ大全」が教えてくれたこと
bani24884
1
210
pylint custom ruleで始めるレビュー自動化
shogoujiie
0
150
GoとPHPのインターフェイスの違い
shimabox
2
210
バッチを作らなきゃとなったときに考えること
irof
2
530
CSS Linter による Baseline サポートの仕組み
ryo_manba
1
150
PHPのバージョンアップ時にも役立ったAST
matsuo_atsushi
0
230
複数のAWSアカウントから横断で 利用する Lambda Authorizer の作り方
tc3jp
0
120
Bedrock Agentsレスポンス解析によるAgentのOps
licux
3
930
Jakarta EE meets AI
ivargrimstad
0
410
Introduction to kotlinx.rpc
arawn
0
770
Featured
See All Featured
Become a Pro
speakerdeck
PRO
26
5.2k
Building Applications with DynamoDB
mza
93
6.2k
Why Our Code Smells
bkeepers
PRO
336
57k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
129
19k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
231
53k
Six Lessons from altMBA
skipperchong
27
3.6k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Writing Fast Ruby
sferik
628
61k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
666
120k
Embracing the Ebb and Flow
colly
84
4.6k
GraphQLとの向き合い方2022年版
quramy
44
14k
Practical Orchestrator
shlominoach
186
10k
Transcript
ςετͱྑ͘ͳΓ͍ͨɺ ͳΓͨ͘ͳ͍ʁ σϒϥΠϒʂ`21 / 2021.04.16 BY Hideki Kinjyo
ࣗݾհ • ۚलथ / ͖Μ͡ΐ͏ͻͰ͖ • GitHub: @o0h / Twitter:
@o0h_ • ͖ͳFWCakePHP • ΞΠίϯ ඒຯ͍͠ࡪࢠကͷࣸਅͰ͢
ࣗݾհͷհ ࣗ ݾ հ ͍ ·
Θ ͠ ͯ · ͢ Α ʂ
ࠓͷ͓
ൃදλΠτϧݟͯҾ͍ͯ·ͤΜʁʁ
େৎͰ͔͢ʁʁʁ
͜ͷൃදΛฉ͖ऴΘͬͨ࣌ʹɺ ʮςετ͍͍ͬͯΑͶɺେ͖ʯͱ͍͏ؾ࣋ͪʹ গ͠Ͱͳͬͯ͘ΕͨΒخ͍͠Ͱ͢
͓͠ͳ͕͖ 1.ςετͱͲ͏͍͏ͷ͔ 2.ςετԿΛͨΒ͔͢ɾԿ͕ඞཁ͔ 3.ςετͷྑ͞Λ࣮ײ͢Δ 4.Ͳ͏ͬͨΒςετΛॻ͘͘͢ͳΔ͔
#1 ςετͱͲ͏͍͏ͷ͔
ʮιϑτΣΞςετʯΛఆٛ͢Δͱͨ͠Β ͳΜͱઆ໌͠·͔͢ʁ
ςετͱɼΤϥʔ͕ͳ͍͜ͱΛ͠Ί͍ͯ͘͠աఔͰ͋Δ ςετͷతɼϓϩάϥϜ͕ҙਤ͞ΕͨػೳͲ͓Γʹਖ਼͘͠ ಈ͍ͯ͘ΕΔ͜ͱΛ͠Ί͢͜ͱͰ͋Δ ςετͱɼϓϩάϥϜ͕ࢥ͍Ͳ͓Γʹಈ͘͜ͱͷ֬৴Λ࡞ͬ ͍ͯ͘աఔͰ͋Δ ࡾΫΠζʂ
͜ΕΒͷఆٛɼ ςετʹ͍ͭͯͷਖ਼ରͷఆٛͩͱ ͍͍͍ͬͯ.
ςετͷՁ ʮԿ͔Λ͢Δʯͷ ʮԿΒ͔ͷՁΛͨΒ͢ʯ ͜ͱ͕త • ςετʹΑͬͯͨΒ͞ΕΔՁ: =ϓϩάϥϜͷ ࣭ɾ৴པੑΛ্ͤ͞Δ͜ͱ • ϓϩάϥϜͷ৴པੑΛ্ͤ͞Δͱ?
=ΤϥʔΛΈ͚ͭɼͦΕΛͱΓͷͧ͘͜ͱ • Ձͷߴ͍ςετ: = ΑΓଟ͘ͷΤϥʔΛΈ͚ͭͯ͘ΕΔςετ
ςετͷఆٛ: ςετͱɼΤϥʔΛΈ͚ͭΔͭΓͰ ϓϩάϥϜΛ࣮ߦ͢ΔաఔͰ͋Δ.
Կ͕ҧ͏ͷʁ • લఏͱͯ͠ɺ ʮϓϩάϥϜΤϥʔΛ;͘ΜͰ͍Δʯͱ͍͏Ծఆͷͱ Ͱ։ൃςετʹऔΓΜͰ͍͘ • ͳͷͰʮಈ͘͜ͱΛอূ͢Δʯ͜ͱΑΓɺ ʮΤϥʔΛݟ͚ͭΔʯ͜ͱʹॏ͖Λஔ͘
ࢀߟ • ʰιϑτΣΞςετͷٕ๏ ୈ2൛ʱ ୈ2ষ ϓϩάϥϜɾςετͷ৺ཧֶͱܦࡁֶ
#2 ςετԿΛͨΒ͔͢ɾԿ͕ඞཁ͔
ςετͷʮίεύʯ • ςετͷత = ʮΤϥʔΛূ໌͢Δʯ • Ͳ͏Δ͔ʁ • खಈͰΔ •
ࣗಈͰΔ
ςετͷʮίεύʯ • ʮΔͷ͕େมʯͩͱ ʮΤϥʔΛূ໌͢Δίετʯ͕ߴ͘ͳΔ • →ࣗಈԽ͠Α͏ͥʂʂ • ʮ࡞Δͷ͕େมʯͩͱ ʮςετΛ༻ҙ͢Δίετʯ͕ߴ͘ͳΔ •
→ खಈͰΖ͏ͤʂʂ
ςετϐϥϛου https://martinfowler.com/articles/practical-test-pyramid.html
• https://alisterbscott.com/kb/testing-pyramids/ • https://twitter.com/t_wada/status/361796460725018624
ʮΞΠεΫϦʔϜʯͷʁ 㱻ʮࣗಈԽςετʯͷࢿ࢈ੑͱʁ
ࣗಈԽςετ • ୯ମςετͱ͔݁߹ςετɺE2EςετͳͲͷ ʮϘλϯԡͨ͠Βউखʹςετͯ͘͠ΕΔͷ͓͓͒ʯܥ • ࣗಈԽͷར • ಉ͡࡞ۀΛ࣮ߦͰ͖Δ(ػց͕ಘҙͳͭʂʂ) • ʮίʔυԽʯʹΑͬͯɺखॱͷมߋɾಡղ͕Ͱ͖Δ
ࣗಈԽςετͱίετ • ॳظֶशίετ͔͔ΔΑͶ • ςετϑϨʔϜϫʔΫͷDSL֮͑ͨΓ • CIͰΜͩΓ • ϝϯςίετ͔͔ΔΑͶ •
มߋՕॴ͕૿͑ͨΓೖΓΜͩΓ • ϥϯχϯάඅ༻(࣮ߦ࣌ؒɺCIඅ༻)
ܦࡁతͳࣗಈԽςετ ͏·͍ͬͨ͘߹ • த൫ʹίετ͔͔Δ͕ • ͦ͜Λൈ͚ͯ ίετ͕ʮංେԽ͠ͳ ͍ʯ • ʮςετʹΑͬͯԼ͕Δί
ετʯ͕େ͖͘ͳ͍ͬͯ͘ http://xunitpatterns.com/Goals%20of%20Test%20Automation.html
ෆܦࡁతͳࣗಈԽςετ ͏·͍͍ͬͯ͘ͳ͍߹ • த൫Λൈ͚ͯ ίετ͕ʮංେԽ͠ଓ͚ Δʯ • ʮςετʹΑͬͯԼ͕Δ ίετʯ͕ۃΊͯখ͍͞ http://xunitpatterns.com/Goals%20of%20Test%20Automation.html
ςετʮ࣭ʯ͕େࣄ͡ΌΜʂʂʂʂ
ςετͷ࣭ͬͯͳΜͩʁ
ࣗಈԽςετͷʮΰʔϧʯ
ޮՌᶃ ࣭Λ্ͤ͞Δ • Bug Repellent • ʮόά͕ࠞೖ͢ΔʯͷΛ͙ɺωοτతͳׂ • Defect Localization
• ʮ1ͭͷৼΔ͍ͷݕࠪʯΛΈ߹Θ͍ͤͯ͘ࣄ͕େࣄ • ͦΕʹΑͬͯɺʮͲ͕͜յΕ͍ͯΔ͔ʁʯΛ ໖ີʹɾہॴԽͯ͠ڭ͑ͯ͘ΕΔ
ޮՌᶄ γεςϜཧղΛॿ͚Δ • Tests as Documentation • ςετ͕͋Δ͜ͱͰʮ࣮ࡍʹͦͷΫϥεΛͬͯΈΔʯ ʮಈ͔ͯ͠ΈΔʯ͜ͱ͕Ͱ͖Δ •
લఏ݅ͷຬͨ͠ํɾࣄޙ݅ͷ༰ʹ͍ͭͯɺ ͱखͰ֬ೝ͢Δ͜ͱ͕༰қʹͳΔ
ޮՌᶅ ϦεΫΛݮΒ͢ • Tests as Safety net • ʮ࠷ѱɺͳΜ͔͋ͬͨΒςετͰ͔Δʂʂʯͱ͍͏ ηʔϑςΟωοτతͳׂ
• ςετͷෆʮͰ͜΅ͨ͜͠؛ʯͷΑ͏ͳͷɻ ͓͔ͬͳͼͬ͘ΓਐΜͰಥυΧʔϯʂͬͯͳΔ
BOENPSF ※ ੲͷར༻Α͔ͬͨΒͲ͏ͧʂ https://speakerdeck.com/o0h/she-nei-lt20170810
ࢀߟ • ʰxUnit Test Patternsʱ Chapter 3. Goals of Test
Automation
#3 ςετͷྑ͞Λ࣮ײ͢Δ
ʮςετʹཱͭʯͱ͍͏ˠΘ͔Δ ʮςετΖ͏ͥʂʂʯˠΊΜͲ͍
(͜Μͳਓ͍·ͤΜ͔ʁ)
ʮςετͰศརʯͬͯͷ͕ ࣮ײͰ͖ΕΑ͍ͷ͔ͳʁ
ʮςετศརʯͷͨΊʹ • ʮతʯ͕ମײͰ͖ΔͱOK: “ΤϥʔΛΈ͚ͭΔͭΓͰॻ͘ͷ” • Test as Specification: ʮ͜ͷϝιου௨͢ͷ໘͍͘͞ΜͩΑͶʙʯ →ςετॻ͍ͯݸผʹͦͷϝιου࣮ߦʂʂ
• Bug Repellent, Defect Localization ʮͪΐͬͱ͍ͬͨ͡ΒյΕͨɺԿͰʁʁʯ → ہॴԽͨ͠ݕࠪΛͨ͘͞Μ߹Θ͓͚ͯʮͳͥʯΛςετ͕ड़ͯ͘ ΕΔʂʂ
·ͣTDDͬͯΈΔͱྑ͍ʙ • TDD: ςετͷʮྑ͞ʯΛ։ൃʹ׆͔͢ͷ • ϓϩάϥϚͷෆ҆Λίϯτϩʔϧ͢Δ • υΩϡϝϯτΘΓʹ͢Δ • ʮมͩΑʯʮେৎͩΑʯΛϑΟʔυόοΫ͢Δ
ʮෆ҆Λίϯτϩʔϧʯͬͯʁ • ։ൃதͷෆ҆ • ҾΛ͜͏ͨ͠ΒͲ͏ͳΔΜͩΖ͏ʁ • ྫ֎͕ൃੜͨ͠ΒͲ͏ͳΔΜͩΖ͏ʁ • ͳΜͱͳ༷͘ΠϝʔδͰ͖ͯΔ͚Ͳɺ͋ͬͯΔʁ •
Ͳ͔͜Β࡞ΕΑ͍ͷ͔ͳɾɾʁͳʹ͕ͬͯΔ͚ͬɾɾʁ • 1ൃͰಈ͍ͨɾɾɾʁ
ʮෆ҆Λίϯτϩʔϧʯͬͯʁ • ։ൃதͷෆ҆ • ҾΛ͜͏ͨ͠ΒͲ͏ͳΔΜͩΖ͏ʁ • ྫ֎͕ൃੜͨ͠ΒͲ͏ͳΔΜͩΖ͏ʁ • ͳΜͱͳ༷͘ΠϝʔδͰ͖ͯΔ͚Ͳɺ͋ͬͯΔʁ •
Ͳ͔͜Β࡞ΕΑ͍ͷ͔ͳɾɾʁ ͳʹ͕ͬͯΔ͚ͬɾɾʁ ͍ͭ͜ΒΛʮςετͰอূ͍ͯ͠Δ͔ΒOKʯʹ͢Δͷ͕ ʮෆ҆Λίϯτϩʔϧʯ͢Δͱ͍͏͜ͱʂ
TDDͷਐΊํ 1.·ͣʮ͜͏ͬͨΒʯʮ͜͏ͳΔ(͖)ʂʯΛॻ͘ • =ʮΔ͜ͱϦετʯʮToDoϦετʯͷ ʮ߲ʯΛʮ1ςετέʔεʯͱͯ͠දݱ͍ͯ͘͠ 2.ʮΔ͜ͱʯΛຬͨ͢Α͏ʹ(SUTͷ)ίʔυΛࡶʹॻ͘ 3.ʮΔ͜ͱʯ͕ຬͨ͞Εͨঢ়ଶ(=͏ಈ͘ʂOKʂʂ)Ͱ ஸೡʹਗ਼ॻΛ͢Δ
ͦΕͰͲ͏ͳΔͷʁ • ʮͲ͜·ͰOKͰɺͲ͕͜ඍົ͔ʯΛ ઌʹʮஅՄೳʯʹ͓͚ͯ͠Δʂʂ • ʮͲ͜·ͰOKʁຊʹʁʁʯ͕͔Δͱ ʮෆ҆ʯ͕ݮΔʂ҆৺Ͱ͖Δʂʂ • ʮͪΐͬͱ࿔Γ͍ͨ(ϦϑΝΫλ͍ͨ͠)ʯͱࢥͬͨ࣌ʹ طʹʮ໋ߝʯ͕͋Δʂʂʂ
• ͜ͷลΓ͕ʮࣗಈԽςετͷՁʯʹ݁͢ΔΑʙʙͬͯ
ʮTDDࣗମͰςετ ≠ ࠷ऴతͳςετʯ Ͱ͋Δ͚ΕͲɺ ʮࣗಈԽςετͰಘΒΕΔԸܙʯ ମײͰ͖Δͣ
TDDͲ͔͜Β࢝ΊΕʁ Ͳ͔͜ΒͰOK!! • ϘτϜΞοϓςετ: Ϋϥεϝιου͕໌͍ͯ͠ΔͳΒɺ 1൪খ͞ͳʮ෦ʯ͔ΒςετԽΛ࢝ΊΒΕΔ • τοϓμϯςετ: ৄࡉͳઃܭΓͳ͕Βߟ͍͑ͨɾɾ࣌ʹ ΑΓେ͖ͳߏ͔ΒΓΌ͑͑ͷΑ
TDDͲ͔͜Β࢝ΊΕʁ • ͍ͣΕͷΞϓϩʔνͰ ʮςετ͕͋Εɺมߋා͘ͳ͘ͳΔʂʂʯ ͱ͍͏ԸܙΛ͏͚ΒΕΔΑ͏ʹͳΔ • ʮࠓΘ͔͍ͬͯΔ͜ͱʯͱʮ·͔͍ͩͬͯͳ͍͜ͱʯΛ ʮςετέʔεʯͰදݱ͍ͯ͘͠ʙͱ͍͏܁Γฦ͠ • ઈରʹશͯTDDͰΔʂʂͱ͍͏ඞཁͳ͍ɺ
ʮෆ͕҆ڧ͍ͱ͜Ζʯʮೖྗɾ݁Ռ͕ݻ·͍ͬͯΔͱ͜Ζʯ͚ͩʙͰ
ࢀߟ • ʰςετۦಈ։ൃʱ • ·ͣجૅతͳTDDʹ͍ͭͯͪ͜ΒͰ • ʰ ςετίʔυͷϦϑΝΫλϦϯά͕ࢦ͢ͷʱ https://dxd2021.cto-a.org/program/time-table/a-1
ࢀߟ • ʰ࣮ફςετۦಈ։ൃ ςετʹಋ͔ΕͯΦϒδΣΫτࢦ ιϑτΣΞΛҭͯΔʱ • ൃలͨ͠Ϩϕϧ ʮτοϓμϯʯͷTDDͷݟຊ
#4 Ͳ͏ͬͨΒςετΛॻ͘͘͢ͳΔ͔
ςετ͕ʮྑ͍ʯ͔ͬͨɺ ॻ͘ͷ͕͘͠ͳ͍ɾɾʁ
(Θ͔Δ)
Ͳʙʙͬͯҭ͍͔ͬͯ͘ʂʁ • ʮςετͷతɾޮՌʯΛཧղ͢Δ • ۩ମతͳtipsΛΔ
͍ͯ͠Δ࣌ؒͳ͍ͳɾɾɾʁ
ʮ͜ΕΛҙࣝͯ͠ʯॻ͘ʂ • ذ͕͋ͬͨΒɺͲͬͪ௨ΕΔΑ͏ʹҙࣝ͢Δ • σʔλ͕ͳ͍(ۭྻͱ͔)ɺڥք·ΘΓͷΛಥͬࠐΉ • ʮ1ߦ͍ͬͨ͡Β1ՕॴյΕΔʯΑ͏ʹ͢Δ
Ͳ͏ֶͬͯͿ͔ʁ • ຊΛಡ͏ʙʙʙʂ • ྫ͑ɺʮιϑτΣΞςετͷٕ๏ʯͰ ղઆ͞Ε͍ͯΔtipsͨͪˠ • ීஈ͍ͬͯΔϥΠϒϥϦͳͲͷ ςετίʔυΛಡΜͰݟΔ
͝ਗ਼ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠🎉 neͷςετͷʮࢿ࢈ੑ্ʯ͍͖͍ͬͯͨɾɾʂ ͬͯਓ͍ͨͪͨΒࡶஊ͠·͠ΐʂʂʂ