Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
まだまだ間に合うJUnit(再)入門 #jjug_ccc #ccc_g4
Search
yusuke
November 23, 2019
Technology
4.1k
7
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
まだまだ間に合うJUnit(再)入門 #jjug_ccc #ccc_g4
yusuke
November 23, 2019
More Decks by yusuke
See All by yusuke
Riderを使った最新Unreal Engine/Unity開発
yusuke
0
38
AI時代のPhpStorm最新事情 #phpcon_odawara
yusuke
0
660
JetBrainsのAI機能の紹介 #jjug
yusuke
0
390
日本語プログラミングとSpring Bootアプリケーション開発 #kanjava
yusuke
3
870
Python開発環境 - PyCharmとAI #stapy
yusuke
1
140
PhpStorm超絶技巧40分集中講義 #phpconkagawa
yusuke
6
2.2k
PhpStorm超絶技巧20分集中講座 #phpcon_odawara #kama
yusuke
2
1.1k
PHPカンファレンス北海道 - PhpStorm最新情報 #phpcondo
yusuke
1
230
PhpStorm最新情報 AIとnew UI、便利プラグイン #phpcon_okinawa
yusuke
0
490
Other Decks in Technology
See All in Technology
Deep Data Security 機能解説
oracle4engineer
PRO
3
970
「作れる」と「リリースできる」の間にあったもの── PdMを外して見えた、PdMがやるべき仕事/Buildable ≠ Shippable: What Removing the PM Taught Me About the PM’s Job
yappli_developers
0
380
AIエージェントに 権限と鍵をどこまで渡すか
nrinetcom
PRO
2
150
Autonomous AI Lakehouse - Live AI Hubから始めるセキュアなAIデータ活用 -
oracle4engineer
PRO
2
170
書き手が人でもAIでも正しくなる道、SREを埋め込んだDeveloper Platform / tech drivers day8
chmikata
4
830
増え続けるプロダクトの品質をどう担保するか。ProductSpecとTypeScriptによる取り組み
joere
1
170
reInvent2026stby LT00 "Change your life!"
shinichirokawano
1
460
Obsidian Vault Architectures
x5gtrn
PRO
0
210
AI駆動開発における開発環境のセキュリティの考え方
yamahiro
2
670
1週間、Opus封印でお願いします
kintotechdev
0
370
2026-10-24 JAWS JAWS-UG 茨城 #18 IAM Policy Autopilotってなにさ。terraform planからIAM Policyつくれるの? / What's IAM Policy Autopilot
masasuzu
0
180
シンプルな設定ファイルで実現する AWS IAM Identity Center の ユーザー管理Terraformフレームワークを公開しました / Simplifying AWS IAM Identity Center User Management: An Open-Source Terraform Framework
yamaguchitk333
1
340
Featured
See All Featured
How GitHub (no longer) Works
holman
316
150k
Principles of Awesome APIs and How to Build Them.
keavy
128
18k
Accessibility Awareness
sabderemane
1
270
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
360
How Software Deployment tools have changed in the past 20 years
geshan
2
35k
Navigating the Design Leadership Dip - Product Design Week Design Leaders+ Conference 2024
apolaine
2
490
From π to Pie charts
rasagy
1
420
Agile that works and the tools we love
rasmusluckow
331
22k
DevOps and Value Stream Thinking: Enabling flow, efficiency and business value
helenjbeal
2
420
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
3
3.9k
What the history of the web can teach us about the future of AI
inesmontani
PRO
2
760
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
310
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 εΫϦʔϯγϣοτ
࣭ʁ
͋Γ͕ͱ͏͍͟͝·ͨ͠