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
まだまだ間に合うJUnit(再)入門 #jjug_ccc #ccc_g4
Search
yusuke
November 23, 2019
Technology
7
3.9k
まだまだ間に合うJUnit(再)入門 #jjug_ccc #ccc_g4
yusuke
November 23, 2019
Tweet
Share
More Decks by yusuke
See All by yusuke
日本語プログラミングとSpring Bootアプリケーション開発 #kanjava
yusuke
2
450
Python開発環境 - PyCharmとAI #stapy
yusuke
1
45
PhpStorm超絶技巧40分集中講義 #phpconkagawa
yusuke
6
1.6k
PhpStorm超絶技巧20分集中講座 #phpcon_odawara #kama
yusuke
2
900
PHPカンファレンス北海道 - PhpStorm最新情報 #phpcondo
yusuke
1
170
PhpStorm最新情報 AIとnew UI、便利プラグイン #phpcon_okinawa
yusuke
0
390
最新JavaとIDE #jjug
yusuke
1
410
企業システムにおけるTwitter API適用事例とTwitter4Jアップデート #TwitterDevJP
yusuke
0
230
#projava #jjug 転生したらプロのJavaだった件
yusuke
1
320
Other Decks in Technology
See All in Technology
ITエンジニアを取り巻く環境とキャリアパス / A career path for Japanese IT engineers
takatama
4
1.5k
ソフトウェアテストのAI活用_ver1.10
fumisuke
0
230
コードの考古学 〜労務システムから発掘した成長の糧〜
kenta_smarthr
1
1.1k
金融システムをモダナイズするためのAmazon Elastic Kubernetes Service(EKS)ノウハウ大全
daitak
0
120
Cloud Run を解剖して コンテナ監視を考える / Breaking Down Cloud Run to Rethink Container Monitoring
aoto
PRO
0
110
セキュリティSaaS企業が実践するCursor運用ルールと知見 / How a Security SaaS Company Runs Cursor: Rules & Insights
tetsuzawa
0
220
GitHub Coding Agent 概要
kkamegawa
1
1.6k
会社員しながら本を書いてきた知見の共有
sat
PRO
3
690
プラットフォームとしての Datadog / Datadog as Platforms
aoto
PRO
1
330
KMP導⼊において、マネジャーとして考えた事
sansantech
PRO
1
210
All About Sansan – for New Global Engineers
sansan33
PRO
1
1.2k
エンジニア幼年期の終わり
rebase_engineering
1
110
Featured
See All Featured
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
29
9.5k
The Web Performance Landscape in 2024 [PerfNow 2024]
tammyeverts
5
620
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
30
2.4k
ReactJS: Keep Simple. Everything can be a component!
pedronauck
667
120k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
8
750
Build The Right Thing And Hit Your Dates
maggiecrowley
35
2.7k
How to Think Like a Performance Engineer
csswizardry
23
1.6k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
31
1.2k
Git: the NoSQL Database
bkeepers
PRO
430
65k
Fontdeck: Realign not Redesign
paulrobertlloyd
84
5.5k
Site-Speed That Sticks
csswizardry
7
590
What's in a price? How to price your products and services
michaelherold
245
12k
Transcript
·ͩ·ͩؒʹ߹͏ +6OJU ࠶ ೖ ࢁຊϢʔεέ KKVH@DDDDDD@H
ࢁຊϢʔεέ!ZVTVLF w+BWBνϟϯϐΦϯ w%VLFT$IPJDF"XBSEड
ྑ͋͘Δ։ൃఔ ઃܭ ࣮ ςετ σόοά ӡ༻ ཁ݅ఆٛ
։ൃͷ࣮ࡍ Yʙ㱣 ઃܭ ࣮ ςετ σόοά ӡ༻ ཁ݅ఆٛ
ʮςετఔʯͷ w ਓ͕ؒߦ͏ςετͷ৴པੑ w ίετɺ࣌ؒͷ੍ݶ͔Βճؼςετ͕͍͠ w σόοάྃΛ։ൃऀ͕֬ೝ͠ͳ͍ w όάΛࢦఠ͞ΕΔ৺ཧతμϝʔδ w
ςετఔཁһͷͨΊʹόάΛ͢ʜʁ
ςετΛࣗಈԽ w ਓؒΑΓߴ͍৴པੑ৴པੑ w ճؼςετΛݱ࣮తͳίετͰ࣮ݱՄ ೳ w σόοάྃΛ࣮࣌ʹ֬ೝ w σόοάָ͕͘͠ͳΔ
+6OJUͱ wUIFQSPHSBNNFSGSJFOEMZUFTUJOH GSBNFXPSLGPS+BWB wʮ+BWB͚ͷϓϩάϥϚϑϨϯυϦͳ ςετϑϨʔϜϫʔΫʯ IUUQTKVOJUPSHKVOJU
+6OJUͱ w+BWBίʔυͷςετΛ؆୯ʹ͢Δϑ ϨʔϜϫʔΫ +BWB +6OJUɺ5FTU/( 1ZUIPO VOJUUFTU 1)1 1)16OJU 3VCZ
UFTUVOJUɺ34QFD $ /6OJUɺ.45FTU ओཁݴޠͷςετϑϨʔϜϫʔΫ
ࠓճͷςετର'J[[#V[[ w ʙ·Ͱͷࣈʹ͍ͭͯʜ w ͷഒͷ߹'J[[ΛϓϦϯτ w ͷഒ#V[[ΛϓϦϯτ w ͲͪΒͰͳ͍߹ࣈΛϓϦϯτ
ࠓճͷςετର'J[[#V[[ public class FizzBuzz { public static void main(String[] args){
for(int i=0;i<100;i++){ System.out.println(fizzBuzz(i)); } } public static String fizzBuzz(int number) { // ͜͜Λ࣮ } }
࠷খݶͷ+6OJUςετ import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class FizzBuzzTest { @Test
void fizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); } }
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class FizzBuzzTest { @Test void
fizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); } } Ξϊςʔγϣϯ Ξαʔγϣϯϝιου +6OJUςετͷେࣄͳೋཁૉ
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class FizzBuzzTest { @Test void
fizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); } } @TestΞϊςʔγϣϯ ςετΛߦ͏ϝιουͩͱએݴ
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class FizzBuzzTest { @Test void
fizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); } } assertEquals(a, b) b͕aͱ͍͜͠ͱΛओு
όά͍ͬͯΔ࣮ public class FizzBuzz { public static void main(String[] args){
for(int i=0; i<100; i++){ System.out.println(fizzBuzz(i)); } } public static String fizzBuzz(int number) { return "Fizz"; } } p[[#V[[͕'J[[͔͠ฦ͞ͳ͍
όά͍ͬͯΔ࣮ͷ+6OJU࣮ߦ݁Ռ
όά͍ͬͯΔ࣮ͷ+6OJU࣮ߦ݁Ռ IDEͰςετ࣮ߦɺࣦഊͨ͠ςετΛҰཡ
+6OJU࣮ߦ݁Ռ assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15));
ςετΛॆ࣮ͤ͞Δ class FizzBuzzTest { @Test void fizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(45));
assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(60)); } @Test void fizz {} @Test void buzz {} @Test void number {} }
class FizzBuzzTest { @Test void fizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(45)); assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(60));
} @Test void fizz {} @Test void buzz {} @Test void number {} } ςετΛॆ࣮ͤ͞Δ ςετύλʔϯΛ૿͢ͱ্࣭͕ ςετϝιουԿݸ͋ͬͯྑ͍ ΞαʔγϣϯԿݸ͋ͬͯྑ͍
class FizzBuzzTest { @Test void fizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(45)); assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(60));
} @Test void fizz {} @Test void buzz {} @Test void number {} } ςετΛॆ࣮ͤ͞Δ ςετύλʔϯΛ૿͢ͱ্࣭͕ ςετϝιουԿݸ͋ͬͯྑ͍ ΞαʔγϣϯԿݸ͋ͬͯྑ͍ assertϝιουͰ࠷ॳʹࣦഊͨ͠ ͱ͜ΖͰςετϝιουͷ࣮ߦఀࢭ
ϓϩδΣΫτʹ͓͚Δ+6OJUͷઃఆ
.BWFOͷ߹ w QPNYNMʹґଘΛهड़
(SBEMFͷ߹ w CVJMEHSBEMFʹґଘΛهड़
+6OJUςετͷ࣮ߦํ๏
+6OJUςετͷ࣮ߦ w *%&͔Β w ίϚϯυϥΠϯ͔Β w $*αʔό͔Β
+6OJUςετͷ࣮ߦ*%&͔Β w ࠷Ұൠత w ଟ͘ͷ*%&Ͱ(6*Ͱ࣮ߦՄೳ
+6OJUςετͷ࣮ߦίϚϯυϥΠϯ͔Β w .BWFO(SBEMFΛ͏ NWOUFTU HSBEMFUFTU
දతͳΞαʔγϣϯϝιου w BTTFSU&RVBMT B C BͱC͕͍͠ w BTTFSU5SVF B B͕USVF
w BTTFSU'BMTF B B͕GBMTF w BTTFSU/VMM B B͕OVMM w BTTFSU/PU/VMM B B͕OVMMͰͳ͍
දతͳΞϊςʔγϣϯ w !5FTUςετϝιουͷϚʔΫ ຖςετϝιουલޙʹॲཧ w !#FGPSF&BDI֤ςετͷલʹॲཧ w !"GUFS&BDI֤ςετͷޙʹॲཧ ΫϥεͰҰ͚ͩॳظԽޙॲཧ w
!#FGPSF"MMશςετͷલʹॲཧ w !"GUFS"MMશςετͷޙʹॲཧ
σϞ
Ҏલͷόʔδϣϯͷ+6OJU
+6OJUͷόʔδϣϯ w +6OJUY͘ීٴ w +6OJUYΞϊςʔγϣϯಋೖ w +6OJUYϥϜμࣜಋೖ
+VOJUYͱ+6OJUYͷҧ͍
+VOJUY w Ξϊςʔγϣϯ͕Ұ෦ҧ͏ w ςετΫϥεɺϝιουQVCMJD w )BNDSFTU BTTFSU5IBU Ϛονϟʔ͕ಉࠝ
+6OJUYͱ+6OJUY +6OJUY +6OJUY !#FGPSF !#FBGPSF&BDI !"GUFS !"GUFS&BDI !#FGPSF$MBTT !#FGPSF"MM !"GUFS$MBTT
!"GUFS"MM Ξϊςʔγϣϯͷҧ͍
+6OJUYͱ+6OJUY IBNDSFTUΞαʔγϣϯ assertThat(a, equalTo(b)); assertEquals(b, a); JUnit 5ͰґଘΛՃ͢Εhamcrestར༻Մೳ JUnit 4.x
JUnit 5.x JUnit 4.xͰassertEqualsͳͲඪ४Ͱར༻Մೳ
class FizzBuzzTest { @Test void fizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); } }
public class FizzBuzzTest { @Test public void fizzBuzz { assertThat(FizzBuzz.fizzBuzz(15), equalTo("FizzBuzz")); } } JUnit 4.x JUnit 5.x
+VOJUYͱ+6OJUYͷҧ͍
+VOJUY w Ξϊςʔγϣϯ͕ͳ͍ w ςετΫϥε5FTU$BTFΛܧঝ w ςετϝιουUFTUͰ࢝ΊΔ w ςετΫϥεɺϝιουQVCMJD
import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; class FizzBuzzTest { @Test void
fizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); } } import junit.framework.TestCase; public class FizzBuzzTest extends TestCase { public void testFizzBuzz { assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15)); } } JUnit 3.x JUnit 5.x
ςετͷίπ
ςετͷίπ ςετΛઌʹॻ͘
ςετΛઌʹॻ͘ w ςετࣦഊΛ֬ೝ͔ͯ͠Β࣮
ςετΛઌʹॻ͘ w ςετࣦഊΛ֬ೝ͔ͯ͠Β࣮ ޙ͔ΒςετΛॻ͘ͱ࣮༰ʹؔΘΒͣ ޭ͢Δςετʹͳͬͯ͠·͏͜ͱ͕ɾɾɾ
TDD: Test Driven Development Test Early Fail Fast
ςετͷίπ ͔Γ͍͢ ςετϝιου໊
͔Γ͍͢ςετϝιου໊ @Test void orderInfo1 {…} @Test void orderInfo2 {…} ςετ༰͕͔Βͳ͍ςετϝιου໊
͔Γ͍͢ςετϝιου໊ @Test void डલʹٻঢ়ଶʹભҠͰ͖ͳ͍ {…} @Test void લ͍ͷ͓٬༷ʹٻॻͰͳ͘ೲॻΛൃߦ {…} @Test
void orderInfo1 {…} @Test void orderInfo2 {…} ςετ༰͕͔Βͳ͍ςετϝιου໊ ςετ༰͕ࣗ໌ͳςετϝιου໊
@Test void डલʹٻঢ়ଶʹભҠͰ͖ͳ͍ {…} @Test void લ͍ͷ͓٬༷ʹٻॻͰͳ͘ೲॻΛൃߦ {…} @Test void
orderInfo1 {…} @Test void orderInfo2 {…} ςετ༰͕͔Βͳ͍ςετϝιου໊ ςετ༰͕ࣗ໌ͳςετϝιου໊ ͔Γ͍͢ςετϝιου໊ ϓϩδΣΫτϝϯόʔશһຊޠʹתೳͰ͋ Εϝιου໊ຊޠͰOK
ςετͷίπ ςετϝιουʹ BTTFSUJPOΛॻ͖͗͢ͳ͍
ϝιουʹBTTFSUJPOΛॻ͖͗͢ͳ͍ w ΄Ͳ΄Ͳʹ·ͱ·ͬͨ୯ҐͰ w ඞཁʹԠͯ͡BTTFSU"MMΛར༻
BTTFSU"MM import static FizzBuzz.* class FizzBuzzTest { @Test void fizzBuzz
{ assertAll( () -> assertEquals("Fizz", fizzBuzz(3)), () -> assertEquals("Buzz", fizzBuzz(5)), () -> assertEquals("7", fizzBuzz(7)), () -> assertEquals("FizzBuzz", fizzBuzz(15)) ); } ϥϜμࣜΛͬͯ·ͱΊͯݕূ ࣦഊ͢ΔΞαʔγϣϯ͕͋ͬͯશͯݕূ
BTTFSU"MM assertAllͷࣦഊͨ͠assertશ͕ͯใࠂ͞ΕΔ
ςετͷίπ̐ ΧόϨοδʢཏʣ ʹͩ͜ΘΓ͗͢ͳ͍
ΧόϨοδʹͩ͜ΘΓ͗͢ͳ͍ w ΧόϨοδ࣮ߦՄೳͳߦͷ͏ͪɺςε τΛ࣮ࢪͨ͠ߦͷׂ߹ w *%&$*ͰଌఆՄೳ w HFUUFSTFUUFSͷςετෆཁ w ࣮ূࡁΈίʔυ
ஶ໊ϥΠϒϥϦͳͲ ͷ ڍಈςετ͠ͳ͍
ςετΛ༏ઌతʹॻ͖͘ର w ࣮͕ෆ҆ͳՕॴ w όάɺϦάϨογϣϯ͕ൃੜ͠ ͦ͏ͳՕॴ w ϦϑΝΫλϦϯάΛࢪ͢Օॴ
QSJWBUFϝιουͷςετʁ w QBDLBHFQSJWBUFʹ w ޡ༻͕৺ͳ߹ίϝϯτ
ςετΛ࢝ΊΑ͏
ςετΛ࢝ΊΔ w खಈςετ͕ඪ४ͳͷͰ͍͠ʁ
ςετΛ࢝ΊΔ w खಈςετ͕ඪ४ͳͷͰ͍͠ʁ w ̍ਓͰ࢝ΊΒΕ·͢
ςετΛ࢝ΊΔ w ςετΛॻ͘༨ܭʹ͕͔͔࣌ؒΔͷͰʁ
ςετΛ࢝ΊΔ w ςετΛॻ͘༨ܭʹ͕͔͔࣌ؒΔͷͰʁ w Ή͠Ζૣ͘ͳΓ·͢
ςετ͕श׳Խͨ͠Β
$* $POUJOVPVT*OUFHSBUJPO w +FOLJOTɺ$JSDMF$*ɺ5FBN$JUZ w ςετ࣮ߦΛࣗಈԽ w ςετ࣮ߦͷ࿙Ε͕ͳ͘ͳΔ w ςετྃΛͨͣʹผͷ࡞ۀ͕Ͱ͖Δ
4FMFOJVN w ϩδοΫ͚ͩͰͳ͘ɺ8FCΞϓϦέʔγϣϯ ͷૢ࡞ςετՄೳ w ϑΥʔϜೖྗ w εΫϦʔϯγϣοτ
࣭ʁ
͋Γ͕ͱ͏͍͟͝·ͨ͠