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

C74faf8a5336f2898b08202e98211e06?s=47 yusuke
November 23, 2019

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

C74faf8a5336f2898b08202e98211e06?s=128

yusuke

November 23, 2019
Tweet

Transcript

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

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

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

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

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

    ςετ޻ఔཁһͷͨΊʹόάΛ࢒͢ʜʁ
  6. ςετΛࣗಈԽ w ਓؒΑΓ΋ߴ͍৴པੑ৴པੑ w ճؼςετΛݱ࣮తͳίετͰ࣮ݱՄ ೳ w σόοά׬ྃΛ࣮૷࣌ʹ֬ೝ w σόοάָ͕͘͠ͳΔ

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

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

    UFTUVOJUɺ34QFD $ /6OJUɺ.45FTU ओཁݴޠͷςετϑϨʔϜϫʔΫ
  9. ࠓճͷςετର৅'J[[#V[[ w ʙ·Ͱͷ਺ࣈʹ͍ͭͯʜ w ͷഒ਺ͷ৔߹'J[[ΛϓϦϯτ w ͷഒ਺#V[[ΛϓϦϯτ w ͲͪΒͰ΋ͳ͍৔߹਺ࣈΛϓϦϯτ

  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) { // ͜͜Λ࣮૷ } }
  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)); } }
  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ςετͷେࣄͳೋཁૉ
  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Ξϊςʔγϣϯ ςετΛߦ͏ϝιουͩͱએݴ
  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ͱ౳͍͜͠ͱΛओு
  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[[͔͠ฦ͞ͳ͍
  16. όά͍ͬͯΔ࣮૷ͷ+6OJU࣮ߦ݁Ռ

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

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

  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 {} }
  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 {} } ςετΛॆ࣮ͤ͞Δ ςετύλʔϯΛ૿΍͢ͱ඼࣭͕޲্ ςετϝιου͸Կݸ͋ͬͯ΋ྑ͍ Ξαʔγϣϯ͸Կݸ͋ͬͯ΋ྑ͍
  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ϝιουͰ࠷ॳʹࣦഊͨ͠ ͱ͜ΖͰςετϝιουͷ࣮ߦ͸ఀࢭ
  22. ϓϩδΣΫτʹ͓͚Δ+6OJUͷઃఆ

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

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

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

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

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

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

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

    !#FGPSF"MMશςετͷલʹॲཧ w !"GUFS"MMશςετͷޙʹॲཧ
  31. σϞ

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

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

  34. +VOJUYͱ+6OJUYͷҧ͍

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

  36. +6OJUYͱ+6OJUY +6OJUY +6OJUY !#FGPSF !#FBGPSF&BDI !"GUFS !"GUFS&BDI !#FGPSF$MBTT !#FGPSF"MM !"GUFS$MBTT

    !"GUFS"MM Ξϊςʔγϣϯͷҧ͍
  37. +6OJUYͱ+6OJUY IBNDSFTUΞαʔγϣϯ assertThat(a, equalTo(b)); assertEquals(b, a); JUnit 5Ͱ΋ґଘΛ௥Ճ͢Ε͹hamcrest͸ར༻Մೳ JUnit 4.x

    JUnit 5.x JUnit 4.xͰ΋assertEqualsͳͲ͸ඪ४Ͱར༻Մೳ
  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
  39. +VOJUYͱ+6OJUYͷҧ͍

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

  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
  42. ςετͷίπ

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

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

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

  46. TDD: Test Driven Development Test Early Fail Fast

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

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

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

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

    orderInfo1 {…} @Test void orderInfo2 {…} ςετ಺༰͕෼͔Βͳ͍ςετϝιου໊ ςετ಺༰͕ࣗ໌ͳςετϝιου໊ ෼͔Γ΍͍͢ςετϝιου໊ ϓϩδΣΫτϝϯόʔશһ೔ຊޠʹתೳͰ͋ Ε͹ϝιου໊͸೔ຊޠͰ΋OK
  51. ςετͷίπ ςετϝιου಺ʹ BTTFSUJPOΛॻ͖͗͢ͳ͍

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

  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)) ); } ϥϜμࣜΛ࢖ͬͯ·ͱΊͯݕূ ࣦഊ͢ΔΞαʔγϣϯ͕͋ͬͯ΋શͯݕূ
  54. BTTFSU"MM assertAll಺ͷࣦഊͨ͠assertશ͕ͯใࠂ͞ΕΔ

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

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

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

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

  59. ςετΛ࢝ΊΑ͏

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

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

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

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

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

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

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

  67. ࣭໰ʁ

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