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
4k
まだまだ間に合うJUnit(再)入門 #jjug_ccc #ccc_g4
yusuke
November 23, 2019
Tweet
Share
More Decks by yusuke
See All by yusuke
JetBrainsのAI機能の紹介 #jjug
yusuke
0
290
日本語プログラミングとSpring Bootアプリケーション開発 #kanjava
yusuke
2
560
Python開発環境 - PyCharmとAI #stapy
yusuke
1
91
PhpStorm超絶技巧40分集中講義 #phpconkagawa
yusuke
6
1.9k
PhpStorm超絶技巧20分集中講座 #phpcon_odawara #kama
yusuke
2
1k
PHPカンファレンス北海道 - PhpStorm最新情報 #phpcondo
yusuke
1
200
PhpStorm最新情報 AIとnew UI、便利プラグイン #phpcon_okinawa
yusuke
0
440
最新JavaとIDE #jjug
yusuke
1
440
企業システムにおけるTwitter API適用事例とTwitter4Jアップデート #TwitterDevJP
yusuke
0
260
Other Decks in Technology
See All in Technology
10Xにおける品質保証活動の全体像と改善 #no_more_wait_for_test
nihonbuson
PRO
2
230
Amazon Bedrock Knowledge Basesチャンキング解説!
aoinoguchi
0
130
SREが向き合う大規模リアーキテクチャ 〜信頼性とアジリティの両立〜
zepprix
0
440
Tebiki Engineering Team Deck
tebiki
0
24k
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1k
プロポーザルに込める段取り八分
shoheimitani
1
210
データ民主化のための LLM 活用状況と課題紹介(IVRy の場合)
wxyzzz
2
700
会社紹介資料 / Sansan Company Profile
sansan33
PRO
15
400k
FinTech SREのAWSサービス活用/Leveraging AWS Services in FinTech SRE
maaaato
0
130
SREじゃなかった僕らがenablingを通じて「SRE実践者」になるまでのリアル / SRE Kaigi 2026
aeonpeople
6
2.3k
クレジットカード決済基盤を支えるSRE - 厳格な監査とSRE運用の両立 (SRE Kaigi 2026)
capytan
6
2.7k
SREのプラクティスを用いた3領域同時 マネジメントへの挑戦 〜SRE・情シス・セキュリティを統合した チーム運営術〜
coconala_engineer
2
630
Featured
See All Featured
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Build The Right Thing And Hit Your Dates
maggiecrowley
38
3k
Chasing Engaging Ingredients in Design
codingconduct
0
110
4 Signs Your Business is Dying
shpigford
187
22k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
210
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.7k
A Tale of Four Properties
chriscoyier
162
24k
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
3.9k
Google's AI Overviews - The New Search
badams
0
900
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.4k
How to Think Like a Performance Engineer
csswizardry
28
2.4k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
220
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 εΫϦʔϯγϣοτ
࣭ʁ
͋Γ͕ͱ͏͍͟͝·ͨ͠