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
Startup Spock #javajo
Search
kyonmm
PRO
March 25, 2017
Technology
0
2.5k
Startup Spock #javajo
Java女子部でSpockのハンズオンをしたときのスライドです。
kyonmm
PRO
March 25, 2017
Tweet
Share
More Decks by kyonmm
See All by kyonmm
AIのグローバルトレンド2025 #scrummikawa / global ai trend
kyonmm
PRO
1
460
IT子会社のグローバルトレンド #scrumsendai / Global Trends in IT Subsidiaries
kyonmm
PRO
3
1.3k
AIのグローバルトレンド 2025 / ai global trend 2025
kyonmm
PRO
1
260
AI時代における変革の入口-100年後も語られる25年のために- #scrumosaka / The entry point to transformation in the AI era For 25 years that will be talked about 100 years from now
kyonmm
PRO
6
1.8k
地方中小企業のエンジニアから大企業の執行役員になるまで #phpcon_niigata / road to executive
kyonmm
PRO
7
15k
ソフトウェアテストのグローバルトレンド 2025 #scrumniigata / software-test global trend 2025
kyonmm
PRO
10
8.7k
Engineering Managementのグローバルトレンド #emoasis / Engineering Management Global Trend
kyonmm
PRO
6
1.4k
フレームワークを生み出すメタフレームワークという考え方 -適応型から生成型へ- #RSGT2025 / From adaptive to generative
kyonmm
PRO
4
5k
SRE NEXT 2024 スライドみただけの感想 / Just a quick look at the slides for SRE NEXT 2024
kyonmm
PRO
2
630
Other Decks in Technology
See All in Technology
学術的根拠から読み解くNotebookLMの音声活用法
shukob
0
490
"'TSのAPI型安全”の対価は誰が払う?不公平なスキーマ駆動に終止符を打つハイブリッド戦略
hal_spidernight
0
180
AI開発の定着を推進するために揃えるべき前提
suguruooki
1
400
不確実性に備える ABEMA の信頼性設計とオブザーバビリティ基盤
nagapad
4
8.5k
AI エージェント活用のベストプラクティスと今後の課題
asei
2
380
AI駆動開発2025年振り返りとTips集
knr109
1
120
命名から始めるSpec Driven
kuruwic
0
280
Dify on AWS の選択肢
ysekiy
0
110
mablでリグレッションテストをデイリー実行するまで #mablExperience
bengo4com
0
410
pmconf 2025 大阪「生成AI時代に未来を切り開くためのプロダクト戦略:圧倒的生産性を実現するためのプロダクトサイクロン」 / The Product Cyclone for Outstanding Productivity
yamamuteki
3
2.8k
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.9k
AI自動ペンテスト「RapidPen」ご紹介資料
laysakura
0
110
Featured
See All Featured
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
350
How To Stay Up To Date on Web Technology
chriscoyier
791
250k
Art, The Web, and Tiny UX
lynnandtonic
303
21k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.3k
Embracing the Ebb and Flow
colly
88
4.9k
Six Lessons from altMBA
skipperchong
29
4.1k
Building Adaptive Systems
keathley
44
2.8k
Mobile First: as difficult as doing things right
swwweet
225
10k
Large-scale JavaScript Application Architecture
addyosmani
514
110k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Optimizing for Happiness
mojombo
379
70k
How STYLIGHT went responsive
nonsquared
100
5.9k
Transcript
STARTUP SPOCK #JAVAJO kyon_mm 2017/03/25 1
SELF INTRODUCTION • ͖ΐΜ : @kyon_mm גࣜձࣾΦϯβϩʔυ • ςετΞʔΩςΫτɺδΣωϥϦετ •
Groovy, F#, C#, Scala • جૅษڧձ, TDDBootCamp, ͳ͔͝Scrum 2
THIS SESSION : TARGET • Javaݴޠͷجຊจ๏ͳΜͱͳ͘Θ͔͍ͬͯ ͯɺίʔυΛ͔͍ͨΓͰ͖Δɻ • Can you
code FizzBuzz ? 3
THIS SESSION : GOAL • SpockͰ؆୯ͳίʔυΛॻ͚ΔΑ͏ʹͳΔɻ 4
NO • Groovy LanguageΛ͍͜ͳ͢ • SexyͳCodeΛٻ͢Δ 5
MENU • https://github.com/kyonmm/startup-spock • Groovy Language for Java Language User
• Getting Start Spock • Spock with TDD 6
GROOVY LANGUAGE • Groovyͱ • Java8ඇޓͳͷ • ͓֮͑ͯ͘ͱศརͳͷ 7
GROOVYͱ • ਐతܕ͖(੩తܕݕࠪΦϓγϣϯ) • JVMͰಈ࡞͢Δɻgroovy-all.jarͱҰॹʹ͏ɻ • GradleɺJenkinsfileGroovyͷDSLɻ 8
GROOVYͱ • Java6ͱ΄΅ޓੑΛ͍ͨͬͯΔ͕ɺ Java7,Java8ͷ৽ػೳͱҰ෦ޓੑ͕ͳ͍ɻ (Java6Ҏલ͔ΒಠࣗͰ࣮͍ͯͨ͠Γͱ͔) • IntelliJ IDEA + Gradle
+ Spock͕ఆ൪ • OO͕ϕʔεɻޠኮRubyɺPythonͬΆ͞ɻ 9
GROOVY LANGUAGE • Groovyͱ • Java8ඇޓͳͷ • ͓֮͑ͯ͘ͱศརͳͷ 10
Ҏ߱ͷηογϣϯͷͨΊʹ ڥߏங • ιʔείʔυΛߋ৽ͨ͠ͷͰɺGitHub͔Β࠷৽ͷιʔείʔυΛམ ͱ͖͍ͯͯͩ͘͠͞ɻ(git reset --hard; git pull;) •
IntelliJ IDEAͷ࣍ͷઃఆΛ͠·͠ΐ͏ɻ • Plugins -> Spock -> Install • Build Project Automatically • Edit Configurations -> Defaults -> JUnit -> Before LaunchͷBuildΛબ ͯ͠আ( - ϘλϯΛΫϦοΫ) 11
JAVA8ͱඇޓͳͷ • ϥϜμͷΘΓʹΫϩʔδϟΛ͏ • ϝιουࢀরɺίϯετϥΫλࢀর͕ͳ͍ • try-with-resource͕͑ͳ͍ • ྻϦςϥϧ͕͑ͳ͍ 12
ϥϜμͷΘΓʹΫϩʔδϟ Λ͏ • ϥϜμ • ࣜɻJava7·ͰؔΦϒδΣΫτͰ࣮ݱ͍ͯͨ͠Γɻ • GroovyͰϥϜμͷॻ͖ํΛαϙʔτ͍ͯ͠ͳ͍ɻ • GroovyͰΫϩʔδϟͰ࣮ݱ͢Δɻ
• src/test/groovy/example/startup/incompatible/java8/ Lambda.groovy 13
ϝιουࢀরɺ ίϯετϥΫλࢀর͕ͳ͍ • ϝιουࢀর • Ϋϥε໊::ϝιου໊,ΦϒδΣΫτ໊::ϝιου໊ (ಛʹ)ϥϜμͱͷซ༻Ͱ؆ܿͳهड़Λ࣮ݱͰ͖Δɻ Stream.of("javajo", "jjug", "kyon_mm").forEach(System.out::println)
• GroovyͰϝιουࢀরɺίϯετϥΫλࢀরͷॻ͖ํΛαϙʔτ͍ͯ͠ͳ͍ɻ • GroovyͷΫϩʔδϟͰҾΛ໌ࣔ͠ͳ͍ͱ͖ݩͷΦϒδΣΫτ͕ it ͰΘͨͬ ͯ͘ΔͷͰɺ{ println(it) }ͷΑ͏ʹ͏ɻ • src/test/groovy/example/startup/incompatible/java8/MethodReference.groovy 14
TRY-WITH-RESOURCE • try-with-resource • ྫ֎Λߟྀͨ͠Ϧιʔε(IO)ͷΫϩʔζΛࣗಈతʹͬͯ͘ΕΔ • GroovyͰtry-with-resourceͷॻ͖ํΛαϙʔτ͍ͯ͠ͳ͍ɻ • ͨͩ͠ɺସखஈͱͯ͠ withCloseable
ϝιουΛ͏͜ͱ͕Ͱ͖ Δɻ • src/test/groovy/example/startup/incompatible/java8/ TryWithResource.groovy 15
ྻϦςϥϧ͕ͳ͍ • ྻϦςϥϧ • int[] xs = new int[]{1,2,3}; •
GroovyͰ{}ΫϩʔδϟͳͷͰΤϥʔʹͳΔ • ϦετϦςϥϧͰArrayListΛੜͯ͠ɺޙΖʹas int[] Λه͢ Δɻ • src/test/groovy/example/startup/incompatible/java8/ ArrayLiteral.groovy 16
Α͘ΈΔͰ͋Ζ͏ Τϥʔϝοηʔδ • groovy.lang.MissingMethodException: No signature of method: example.startup.groovy.Keyword.newMethod() •
example.startup.groovy.Keyword.newMethod͍ͬͯ͏ϝ ιουͳ͔ͬͨΑ • groovy.lang.MissingPropertyException: No such property: y for class: example.startup.groovy.Keyword • KeyWordΫϥεʹy͍ͬͯ͏ϓϩύςΟͳ͔ͬͨΑ 17
GROOVY LANGUAGE • Groovyͱ • Java8ඇޓͳͷ • ͓֮͑ͯ͘ͱศརͳͷ 18
͓֮͑ͯ͘ͱศརͳͷ • ϦετϦςϥϧ • ϚοϓϦςϥϧ • จࣈྻϦςϥϧ • ਖ਼نදݱϦςϥϧ •
GroovyͷίϨΫγϣϯૢ࡞ϝιουͱJavaͷstreamͱͷൺֱ 19
GROOVYͰΑ͔ͭ͘͏ॻ͖ํ • defͰએݴ • ςετϝιου໊จࣈྻએݴ 20
ͦͷଞҙ • booleanΛظ͞ΕΔॴ(ex. if(x))ʹɺBoolean Ҏ֎ͷࢀরܕ͕͍ͬͨ߹ͳ͍߹ ࣍ͷنଇͰఆ͞Ε·͢ɻ • "", [], [:],
0, null -> false • ͦΕΒҎ֎ -> true 21
MENU • Groovy Language for Java Language User • Getting
Start Spock • Spock with TDD 22
• Spockͱ • JUnitͱͷൺֱ • Spockͷ͍͔ͨ 23
SPOCKͱ • JUnit4ϕʔεͷGroovyͷςεςΟϯάϑϨʔ ϜϫʔΫ • BDDΛҙ͍ࣝͯ͠Δ • powerassert Spock͕ΦϦδϯ(ͩͱࢥ͏) 24
JUNITͱͷൺֱ 25 JUnit Spock Specification Ϋϥε spock.lang.SpecificationΛܧঝ Feature Method @Test
SpockͷϥϕϧΛ༻͢Δϝιου Helper Method ϝιουએݴ @Share Fixture Method @Before setupϝιου Fixture Method @After cleanupϝιου Fixture Method @BeforeClass setupSpecϝιου Fixture Method @AfterClass cleanupSpecϝιου
SPOCKͷ͍͔ͨ • Specification • given, when, then, and, where •
power assert • setup, teardown, setupSpec, cleanupSpec • @Unroll, @Shared, @Ignore 26 src/test/groovy/example/startup/spock ԼΛΈͳ͕Β
MENU • Groovy Language for Java Language User • Getting
Start Spock • Spock with TDD 27
SPOCK WITH TDD • SpockͰTDDΛϖΞϓϩάϥϛϯάͰͬͯΈ· ͠ΐ͏ɻ • ͓ʮλεΫϦετ(λεΫཧπʔϧ)ʯͷ։ൃ Ͱ͢ɻ •
ࠓճγεςϜͷೖྗ෦লུ͠·͢ɻ(CUI, GUI ͷ։ൃলུ͠·͢ɻ) 28
λεΫϦετ • λεΫ໊ͱظΛొͨ͠ΓɺొࡁΈͷ ͷΛࢀরͨ͠Γɺআͨ͠ΓͰ͖Δɻ • λεΫ໊ظͰݕࡧͰ͖Δɻ 29
TaskList ---------------------- add(Task) : TaskList delete(Task) : TaskList list(Task) :
List<Task> search(String) : List<Task> search(Date, Date) : List<Task> searchFrom(Date) : List<Task> searchTo(Date) : List<Task> Task ---------------------- title : String dueTo : Date * 30
TDD • ςετۦಈ։ൃ(Test Driven Development) • ςετ࣮ -> ϓϩμΫτ࣮ ->
ϦϑΝΫλ Ϧϯά ͷ܁Γฦ͠Ͱ։ൃ͢Δɻ • ઃܭ͓Αͼੳͷख๏ 31
TDD3ݪଇ • ϓϩμΫτίʔυࣦഊ͢ΔςετίʔυΛ ޭͤ͞ΔͨΊ͚ͩʹॻ͘ • ςετίʔυࣦഊͤ͞ΔͨΊ͚ͩʹॻ͘ • ෳͷςετΛޭͤ͞ΔΑ͏ͳϓϩμΫτ ίʔυΛॻ͍͍͚ͯͳ͍ 32
ࠓΔTDDϥΠΫͳ։ൃ ςετ࣮ฤ 1. (͠ɺ͍·͔Β࣮͠Α͏ͱ͍ͯ͠Δͷطʹ୭͔͕࣮͠ ͯ͘Ε͍ͯͨΒ) ͲΜͳखॱͰɺͦΕΛ͏ͷ͔? 2. 1Ͱࢥ͍͍͍ͭͨํΛຊޠͰɺٙࣅίʔυͰ͍͍ͷͰς Ωετʹ͢Δɻ 3.
ͦΕΛSpockͷgiven, when, thenʹ͋ͯΊΔɻ 4. ਖ਼͍͠Groovyίʔυʹ͢Δɻ 33
ࠓΔTDDϥΠΫͳ։ൃ ϓϩμΫτ࣮ฤ 1. ςετΛ࣮ͨ͠Βςετ͕ಈ࡞͢ΔΑ͏ͳϓϩ μΫτΛ࣮͢Δɻ 2. ͠ɺ15ͨͬͯςετ͕ޭ͠ͳ͔ͬͨΒɺ͍ ·࣮ݱ͠Α͏ͱ͍ͯ͠ΔςετίʔυΛ@Ignore͠ ͯɺ͏͢͜͠খ͍͞ৼ͍Λ࣮ݱ͢Δςετίʔ υΛهड़ͯ͠ɺ࠶ϓϩμΫτ࣮ʹઓ͢Δɻ
34
ࠓΔTDDϥΠΫͳ։ൃ ϦϑΝΫλϦϯάฤ 1. ϓϩμΫτίʔυͷॏෳ͕͋Εڞ௨Խ 2. ςετίʔυͷॏෳ͕͋Εڞ௨Խ 3. ໊લʹҧײ͕͋ΕϦωʔϜϝιου ͷҠಈɺநग़ 35
λεΫϦετ • λεΫ໊ͱظΛొͨ͠ΓɺొࡁΈͷ ͷΛࢀরͨ͠Γɺআͨ͠ΓͰ͖Δɻ • λεΫ໊ظͰݕࡧͰ͖Δɻ 36
TaskList ---------------------- add(Task) : TaskList delete(Task) : TaskList list(Task) :
List<Task> search(String) : List<Task> search(Date, Date) : List<Task> searchFrom(Date) : List<Task> searchTo(Date) : List<Task> Task ---------------------- title : String dueTo : Date * 37
λεΫϦετ:Ճ͓ • λεΫ໊ͱظΛొͨ͠ΓɺొࡁΈͷͷΛ ࢀরͨ͠Γɺআͨ͠ΓͰ͖Δɻ • λεΫ໊ظͰݕࡧͰ͖Δɻ • λεΫΛӬଓԽ͓ͯ͘͜͠ͱͰɺΞϓϦ͕ऴྃ͠ ͯλεΫΛ͓͚ͯ͠Δ(JSONͱ͔CSVʹग़ྗ͠ ͯಡΈͩͤΔΑ͏ʹ͢Δ)
38