Speaker Deck
Speaker Deck Pro
Sign in
Sign up
for free
まだまだ間に合うJUnit(再)入門 #jjug_ccc #ccc_g4
yusuke
November 23, 2019
Technology
6
2.3k
まだまだ間に合うJUnit(再)入門 #jjug_ccc #ccc_g4
yusuke
November 23, 2019
Tweet
Share
More Decks by yusuke
See All by yusuke
yusuke
1
260
yusuke
1
180
yusuke
13
10k
yusuke
1
160
yusuke
0
2.2k
yusuke
0
740
yusuke
8
3.3k
yusuke
22
7.4k
yusuke
3
440
Other Decks in Technology
See All in Technology
suzukiry
0
200
line_developers
PRO
3
470
sasakendayo
2
250
yosuke_matsuura
PRO
0
3.2k
pinboro
1
1.4k
cygames
1
330
kanaugust
PRO
0
140
yasuakiomokawa
0
280
line_developers
PRO
3
2.6k
yuuturn
1
130
shotakashihara
1
1.3k
con_mame
4
2k
Featured
See All Featured
danielanewman
200
19k
geoffreycrofte
18
770
imathis
478
150k
malarkey
119
16k
sachag
446
36k
paulrobertlloyd
71
1.4k
caitiem20
308
17k
wjessup
338
16k
matthewcrist
73
7.5k
addyosmani
1348
190k
keithpitt
401
20k
addyosmani
310
21k
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 εΫϦʔϯγϣοτ
࣭ʁ
͋Γ͕ͱ͏͍͟͝·ͨ͠