Upgrade to Pro — share decks privately, control downloads, hide ads and more …

まだまだ間に合うJUnit(再)入門 #jjug_ccc #ccc_g4

yusuke
November 23, 2019

まだまだ間に合うJUnit(再)入門 #jjug_ccc #ccc_g4

yusuke

November 23, 2019
Tweet

More Decks by yusuke

Other Decks in Technology

Transcript

  1. ·ͩ·ͩؒʹ߹͏
    +6OJU ࠶
    ೖ໳
    ࢁຊϢʔεέ
    KKVH@DDDDDD@H

    View Slide

  2. ࢁຊϢʔεέ!ZVTVLF
    w+BWBνϟϯϐΦϯ
    w%VLFT$IPJDF"XBSEड৆

    View Slide

  3. ྑ͋͘Δ։ൃ޻ఔ
    ઃܭ ࣮૷ ςετ σόοά ӡ༻
    ཁ݅ఆٛ

    View Slide

  4. ։ൃͷ࣮ࡍ
    Yʙ㱣
    ઃܭ ࣮૷ ςετ σόοά ӡ༻
    ཁ݅ఆٛ

    View Slide

  5. ʮςετ޻ఔʯͷ໰୊
    w ਓ͕ؒߦ͏ςετͷ৴པੑ
    w ίετɺ࣌ؒͷ੍ݶ͔Βճؼςετ͕೉͍͠
    w σόοά׬ྃΛ։ൃऀ͕֬ೝ͠ͳ͍
    w όάΛࢦఠ͞ΕΔ৺ཧతμϝʔδ
    w ςετ޻ఔཁһͷͨΊʹόάΛ࢒͢ʜʁ

    View Slide

  6. ςετΛࣗಈԽ
    w ਓؒΑΓ΋ߴ͍৴པੑ৴པੑ
    w ճؼςετΛݱ࣮తͳίετͰ࣮ݱՄ

    w σόοά׬ྃΛ࣮૷࣌ʹ֬ೝ
    w σόοάָ͕͘͠ͳΔ

    View Slide

  7. +6OJUͱ͸
    wUIFQSPHSBNNFSGSJFOEMZUFTUJOH
    GSBNFXPSLGPS+BWB
    wʮ+BWB޲͚ͷϓϩάϥϚϑϨϯυϦͳ
    ςετϑϨʔϜϫʔΫʯ
    IUUQTKVOJUPSHKVOJU

    View Slide

  8. +6OJUͱ͸
    w+BWBίʔυͷςετΛ؆୯ʹ͢Δϑ
    ϨʔϜϫʔΫ
    +BWB +6OJUɺ5FTU/(
    1ZUIPO VOJUUFTU
    1)1 1)16OJU
    3VCZ UFTUVOJUɺ34QFD
    $ /6OJUɺ.45FTU
    ओཁݴޠͷςετϑϨʔϜϫʔΫ

    View Slide

  9. ࠓճͷςετର৅'J[[#V[[
    w ʙ·Ͱͷ਺ࣈʹ͍ͭͯʜ
    w ͷഒ਺ͷ৔߹'J[[ΛϓϦϯτ
    w ͷഒ਺#V[[ΛϓϦϯτ
    w ͲͪΒͰ΋ͳ͍৔߹਺ࣈΛϓϦϯτ

    View Slide

  10. ࠓճͷςετର৅'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) {
    // ͜͜Λ࣮૷
    }
    }

    View Slide

  11. ࠷খݶͷ+6OJUςετ
    import org.junit.jupiter.api.Test;
    import static org.junit.jupiter.api.Assertions.*;
    class FizzBuzzTest {
    @Test
    void fizzBuzz {
    assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15));
    }
    }

    View Slide

  12. import org.junit.jupiter.api.Test;
    import static org.junit.jupiter.api.Assertions.*;
    class FizzBuzzTest {
    @Test
    void fizzBuzz {
    assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15));
    }
    }
    Ξϊςʔγϣϯ
    Ξαʔγϣϯϝιου
    +6OJUςετͷେࣄͳೋཁૉ

    View Slide

  13. import org.junit.jupiter.api.Test;
    import static org.junit.jupiter.api.Assertions.*;
    class FizzBuzzTest {
    @Test
    void fizzBuzz {
    assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15));
    }
    }
    @TestΞϊςʔγϣϯ
    ςετΛߦ͏ϝιουͩͱએݴ

    View Slide

  14. 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ͱ౳͍͜͠ͱΛओு

    View Slide

  15. όά͍ͬͯΔ࣮૷
    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[[͔͠ฦ͞ͳ͍

    View Slide

  16. όά͍ͬͯΔ࣮૷ͷ+6OJU࣮ߦ݁Ռ

    View Slide

  17. όά͍ͬͯΔ࣮૷ͷ+6OJU࣮ߦ݁Ռ
    IDEͰςετ࣮ߦɺࣦഊͨ͠ςετΛҰཡ

    View Slide

  18. +6OJU࣮ߦ݁Ռ
    assertEquals("FizzBuzz",FizzBuzz.fizzBuzz(15));

    View Slide

  19. ςετΛॆ࣮ͤ͞Δ
    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 {}
    }

    View Slide

  20. 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 {}
    }
    ςετΛॆ࣮ͤ͞Δ
    ςετύλʔϯΛ૿΍͢ͱ඼࣭͕޲্
    ςετϝιου͸Կݸ͋ͬͯ΋ྑ͍
    Ξαʔγϣϯ͸Կݸ͋ͬͯ΋ྑ͍

    View Slide

  21. 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ϝιουͰ࠷ॳʹࣦഊͨ͠
    ͱ͜ΖͰςετϝιουͷ࣮ߦ͸ఀࢭ

    View Slide

  22. ϓϩδΣΫτʹ͓͚Δ+6OJUͷઃఆ

    View Slide

  23. .BWFOͷ৔߹
    w QPNYNMʹґଘΛهड़

    View Slide

  24. (SBEMFͷ৔߹
    w CVJMEHSBEMFʹґଘΛهड़

    View Slide

  25. +6OJUςετͷ࣮ߦํ๏

    View Slide

  26. +6OJUςετͷ࣮ߦ
    w *%&͔Β
    w ίϚϯυϥΠϯ͔Β
    w $*αʔό͔Β

    View Slide

  27. +6OJUςετͷ࣮ߦ*%&͔Β
    w ࠷΋Ұൠత
    w ଟ͘ͷ*%&Ͱ͸(6*Ͱ࣮ߦՄೳ

    View Slide

  28. +6OJUςετͷ࣮ߦίϚϯυϥΠϯ͔Β
    w .BWFO΍(SBEMFΛ࢖͏
    NWOUFTU
    HSBEMFUFTU

    View Slide

  29. ୅දతͳΞαʔγϣϯϝιου
    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Ͱͳ͍

    View Slide

  30. ୅දతͳΞϊςʔγϣϯ
    w !5FTUςετϝιουͷϚʔΫ
    ຖςετϝιουલޙʹॲཧ
    w !#FGPSF&BDI֤ςετͷલʹॲཧ
    w !"GUFS&BDI֤ςετͷޙʹॲཧ
    ΫϥεͰҰ౓͚ͩॳظԽޙॲཧ
    w !#FGPSF"MMશςετͷલʹॲཧ
    w !"GUFS"MMશςετͷޙʹॲཧ

    View Slide

  31. σϞ

    View Slide

  32. Ҏલͷόʔδϣϯͷ+6OJU

    View Slide

  33. +6OJUͷόʔδϣϯ
    w +6OJUY޿͘ීٴ
    w +6OJUYΞϊςʔγϣϯಋೖ
    w +6OJUYϥϜμࣜಋೖ

    View Slide

  34. +VOJUYͱ+6OJUYͷҧ͍

    View Slide

  35. +VOJUY
    w Ξϊςʔγϣϯ͕Ұ෦ҧ͏
    w ςετΫϥεɺϝιου͸QVCMJD
    w )BNDSFTU BTTFSU5IBU
    Ϛονϟʔ͕ಉࠝ

    View Slide

  36. +6OJUYͱ+6OJUY
    +6OJUY +6OJUY
    !#FGPSF !#FBGPSF&BDI
    !"GUFS !"GUFS&BDI
    !#FGPSF$MBTT !#FGPSF"MM
    !"GUFS$MBTT !"GUFS"MM
    Ξϊςʔγϣϯͷҧ͍

    View Slide

  37. +6OJUYͱ+6OJUY
    IBNDSFTUΞαʔγϣϯ
    assertThat(a, equalTo(b));
    assertEquals(b, a);
    JUnit 5Ͱ΋ґଘΛ௥Ճ͢Ε͹hamcrest͸ར༻Մೳ
    JUnit 4.x
    JUnit 5.x
    JUnit 4.xͰ΋assertEqualsͳͲ͸ඪ४Ͱར༻Մೳ

    View Slide

  38. 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

    View Slide

  39. +VOJUYͱ+6OJUYͷҧ͍

    View Slide

  40. +VOJUY
    w Ξϊςʔγϣϯ͕ͳ͍
    w ςετΫϥε͸5FTU$BTFΛܧঝ
    w ςετϝιου͸UFTUͰ࢝ΊΔ
    w ςετΫϥεɺϝιου͸QVCMJD

    View Slide

  41. 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

    View Slide

  42. ςετͷίπ

    View Slide

  43. ςετͷίπ
    ςετΛઌʹॻ͘

    View Slide

  44. ςετΛઌʹॻ͘
    w ςετࣦഊΛ֬ೝ͔ͯ͠Β࣮૷

    View Slide

  45. ςετΛઌʹॻ͘
    w ςετࣦഊΛ֬ೝ͔ͯ͠Β࣮૷
    ޙ͔ΒςετΛॻ͘ͱ࣮૷಺༰ʹؔΘΒͣ
    ੒ޭ͢Δςετʹͳͬͯ͠·͏͜ͱ͕ɾɾɾ

    View Slide

  46. TDD: Test Driven Development
    Test Early
    Fail Fast

    View Slide

  47. ςετͷίπ
    ෼͔Γ΍͍͢
    ςετϝιου໊

    View Slide

  48. ෼͔Γ΍͍͢ςετϝιου໊
    @Test
    void orderInfo1 {…}
    @Test
    void orderInfo2 {…}
    ςετ಺༰͕෼͔Βͳ͍ςετϝιου໊

    View Slide

  49. ෼͔Γ΍͍͢ςετϝιου໊
    @Test
    void ड஫લʹ੥ٻঢ়ଶʹ͸ભҠͰ͖ͳ͍ {…}
    @Test
    void લ෷͍ͷ͓٬༷ʹ͸੥ٻॻͰ͸ͳ͘ೲ඼ॻΛൃߦ {…}
    @Test
    void orderInfo1 {…}
    @Test
    void orderInfo2 {…}
    ςετ಺༰͕෼͔Βͳ͍ςετϝιου໊
    ςετ಺༰͕ࣗ໌ͳςετϝιου໊

    View Slide

  50. @Test
    void ड஫લʹ੥ٻঢ়ଶʹ͸ભҠͰ͖ͳ͍ {…}
    @Test
    void લ෷͍ͷ͓٬༷ʹ͸੥ٻॻͰ͸ͳ͘ೲ඼ॻΛൃߦ {…}
    @Test
    void orderInfo1 {…}
    @Test
    void orderInfo2 {…}
    ςετ಺༰͕෼͔Βͳ͍ςετϝιου໊
    ςετ಺༰͕ࣗ໌ͳςετϝιου໊
    ෼͔Γ΍͍͢ςετϝιου໊
    ϓϩδΣΫτϝϯόʔશһ೔ຊޠʹתೳͰ͋
    Ε͹ϝιου໊͸೔ຊޠͰ΋OK

    View Slide

  51. ςετͷίπ
    ςετϝιου಺ʹ
    BTTFSUJPOΛॻ͖͗͢ͳ͍

    View Slide

  52. ϝιου಺ʹBTTFSUJPOΛॻ͖͗͢ͳ͍
    w ΄Ͳ΄Ͳʹ·ͱ·ͬͨ୯ҐͰ
    w ඞཁʹԠͯ͡BTTFSU"MMΛར༻

    View Slide

  53. 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))
    );
    }
    ϥϜμࣜΛ࢖ͬͯ·ͱΊͯݕূ
    ࣦഊ͢ΔΞαʔγϣϯ͕͋ͬͯ΋શͯݕূ

    View Slide

  54. BTTFSU"MM
    assertAll಺ͷࣦഊͨ͠assertશ͕ͯใࠂ͞ΕΔ

    View Slide

  55. ςετͷίπ̐
    ΧόϨοδʢ໢ཏ౓ʣ
    ʹͩ͜ΘΓ͗͢ͳ͍

    View Slide

  56. ΧόϨοδʹͩ͜ΘΓ͗͢ͳ͍
    w ΧόϨοδ࣮ߦՄೳͳߦͷ͏ͪɺςε
    τΛ࣮ࢪͨ͠ߦͷׂ߹
    w *%&΍$*ͰଌఆՄೳ
    w HFUUFSTFUUFSͷςετ͸ෆཁ
    w ࣮ূࡁΈίʔυ ஶ໊ϥΠϒϥϦͳͲ
    ͷ
    ڍಈ͸ςετ͠ͳ͍

    View Slide

  57. ςετΛ༏ઌతʹॻ͘΂͖ର৅
    w ࣮૷͕ෆ҆ͳՕॴ
    w όάɺϦάϨογϣϯ͕ൃੜ͠
    ͦ͏ͳՕॴ
    w ϦϑΝΫλϦϯάΛࢪ͢Օॴ

    View Slide

  58. QSJWBUFϝιουͷςετ͸ʁ
    w QBDLBHFQSJWBUFʹ
    w ޡ༻͕৺഑ͳ৔߹͸ίϝϯτ

    View Slide

  59. ςετΛ࢝ΊΑ͏

    View Slide

  60. ςετΛ࢝ΊΔ
    w खಈςετ͕ඪ४ͳͷͰ೉͍͠ʁ

    View Slide

  61. ςετΛ࢝ΊΔ
    w खಈςετ͕ඪ४ͳͷͰ೉͍͠ʁ
    w ̍ਓͰ΋࢝ΊΒΕ·͢

    View Slide

  62. ςετΛ࢝ΊΔ
    w ςετΛॻ͘෼༨ܭʹ͕͔͔࣌ؒΔͷͰ͸ʁ

    View Slide

  63. ςετΛ࢝ΊΔ
    w ςετΛॻ͘෼༨ܭʹ͕͔͔࣌ؒΔͷͰ͸ʁ
    w Ή͠Ζૣ͘ͳΓ·͢

    View Slide

  64. ςετ͕श׳Խͨ͠Β

    View Slide

  65. $* $POUJOVPVT*OUFHSBUJPO

    w +FOLJOTɺ$JSDMF$*ɺ5FBN$JUZ
    w ςετ࣮ߦΛࣗಈԽ
    w ςετ࣮ߦͷ࿙Ε͕ͳ͘ͳΔ
    w ςετ׬ྃΛ଴ͨͣʹผͷ࡞ۀ͕Ͱ͖Δ

    View Slide

  66. 4FMFOJVN
    w ϩδοΫ͚ͩͰͳ͘ɺ8FCΞϓϦέʔγϣϯ
    ͷૢ࡞΋ςετՄೳ
    w ϑΥʔϜೖྗ
    w εΫϦʔϯγϣοτ

    View Slide

  67. ࣭໰ʁ

    View Slide

  68. ͋Γ͕ͱ͏͍͟͝·ͨ͠

    View Slide