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
420
Python開発環境 - PyCharmとAI #stapy
yusuke
1
34
PhpStorm超絶技巧40分集中講義 #phpconkagawa
yusuke
6
1.5k
PhpStorm超絶技巧20分集中講座 #phpcon_odawara #kama
yusuke
2
870
PHPカンファレンス北海道 - PhpStorm最新情報 #phpcondo
yusuke
1
160
PhpStorm最新情報 AIとnew UI、便利プラグイン #phpcon_okinawa
yusuke
0
370
最新JavaとIDE #jjug
yusuke
1
400
企業システムにおけるTwitter API適用事例とTwitter4Jアップデート #TwitterDevJP
yusuke
0
220
#projava #jjug 転生したらプロのJavaだった件
yusuke
1
300
Other Decks in Technology
See All in Technology
銀行でDevOpsを進める理由と実践例 / 20250317 Masaki Iwama
shift_evolve
1
110
どっちの API SHOW?SharePoint 開発における SharePoint REST API Microsoft Graph API の違い / Which API show? Differences between Microsoft Graph API and SharePoint REST API
karamem0
0
110
非エンジニアにも伝えるメールセキュリティ / Email security for non-engineers
ykanoh
13
4k
Engineering Managementのグローバルトレンド #emoasis / Engineering Management Global Trend
kyonmm
PRO
6
990
数百台のオンプレミスのサーバーをEKSに移行した話
yukiteraoka
0
680
チームの性質によって変わる ADR との向き合い方と、生成 AI 時代のこれから / How to deal with ADR depends on the characteristics of the team
mh4gf
4
340
チームビルディング「脅威モデリング」ワークショップ
koheiyoshikawa
0
150
Explainable Software Engineering in the Public Sector
avandeursen
0
370
ソフトウェア開発現代史: なぜ日本のソフトウェア開発は「滝」なのか?製造業の成功体験とのギャップ #jassttokyo
takabow
2
1.6k
AIエージェントキャッチアップと論文リサーチ
os1ma
6
1.2k
「家族アルバム みてね」を支えるS3ライフサイクル戦略
fanglang
2
290
Riverpod & Riverpod Generatorを利用して状態管理部分の処理を書き換えてみる簡単な事例紹介
fumiyasac0921
0
110
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
53
5.4k
BBQ
matthewcrist
88
9.5k
Large-scale JavaScript Application Architecture
addyosmani
511
110k
A Philosophy of Restraint
colly
203
16k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
25k
The Cost Of JavaScript in 2023
addyosmani
48
7.6k
GitHub's CSS Performance
jonrohan
1030
460k
Typedesign – Prime Four
hannesfritz
41
2.6k
Unsuck your backbone
ammeep
670
57k
Building Better People: How to give real-time feedback that sticks.
wjessup
367
19k
Scaling GitHub
holman
459
140k
Speed Design
sergeychernyshev
28
870
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 εΫϦʔϯγϣοτ
࣭ʁ
͋Γ͕ͱ͏͍͟͝·ͨ͠