Slide 1

Slide 1 text

XUTP͔ΒֶͿ هड़ੑͷߴ͍ Ϣχοτςετ ʙԶͨͪΛॿ͚ΔϢχοτςετ΁ʙ ߴڮཅଠ࿠(a.k.a. @PoohSunny) 1

Slide 2

Slide 2 text

ߴڮ ཅଠ࿠(@PoohSunny) { team: ["͸ͨΒ͍͘", "ͱΒ͹ʔΏ"], role: "Engineer team leader", lang: ["Java", "Groovy", "Swift"] } 2

Slide 3

Slide 3 text

εϥΠυ͸ ެ։ࡁΈͰ͢ 3

Slide 4

Slide 4 text

QCDͷτϨʔυΦϑͳΜͯ ຊ౰͸ͳ͔ͬͨΜͩ1 1 http://i2key.hateblo.jp/entry/2017/05/15/082655 4

Slide 5

Slide 5 text

ࣗಈςετͩͬͯҰॹ2 2 http://xunitpatterns.com/Goals%20of%20Test%20Automation.html 5

Slide 6

Slide 6 text

ςετ ॻ͍ͯ·͔͢ʔʁ 6

Slide 7

Slide 7 text

ʮ্खʹʯ ςετ ॻ͍ͯ·͔͢ʔʁ 7

Slide 8

Slide 8 text

΄Μ·͢·Μ͔ͬͨ class WorkingTimeCalculatorTest { @Test void ਖ਼ৗܥͷςετ() throws Exception { // (ུ) Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); WorkingTimeCalculator target = new WorkingTimeCalculator(targetUser, workingStartTime1, workingEndTime1, workingStartTime2, workingEndTime2); Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); CalculationResult result = target.getCaluculationResult(); assertEquals(720, result.getWorkTime()); List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); } } 8

Slide 9

Slide 9 text

xUTPͱͷग़ձ͍ 9

Slide 10

Slide 10 text

਺೥ޙ3 3 photo: https://www.flickr.com/photos/daverusso88/20860542330/in/photolist- xMnJsW-8H8jnW-8BDdLz-fS9XhN-e3qtWG-oaibHC-eRMCCx-q9Ftni-n7Lmvm-supyFV-gXyxGZ- fEKqSK-sqqxce-sfR8k1-q7N9Ta-dDw4Zq-9ML2MP-oa6sWm-J5F4zN-4vX6LP-nW3r1Q- rF4QJJ-8BWJj9-A1MjG7-sqqpKR-HgcdWN-7Dy6QC-s7M3Dn-w2RjN3-TZXibu-mMD2tR-o9TZi6- shS8mE-hWRzr-WJPkXw-xe6Rnv-DWz4Ra-yGju6j-fkfg3o-ghz6JD-wR4HYP-7xhvzK-rN2UEW- krfJu3-Duju1z-FSwQ8h-8yNSK2-4vXc2a-DaLuo5-zZyYuS 10

Slide 11

Slide 11 text

xUTPͱͷग़ձ͍(෺ཧ)4 4 ಈը: https://engineers.sg/video/unit-test-craftsmanship-agile-singapore- conference-2016--1168 εϥΠυ: http://singapore2016.xunitpatterns.com/ 11

Slide 12

Slide 12 text

xUTPͷྗΛआΓͯ ςετΛୟ͖௚͢ 12

Slide 13

Slide 13 text

ͳΜͷͨΊͷ ςετࣗಈԽʁ 13

Slide 14

Slide 14 text

ςετͷʮ΂͖ʯ࿦ • ςετ͸[඼࣭޲্, SUTͷཧղ, ϦεΫݮগ]Λ ॿ͚Δ • ςετ͸[࣮ߦ, ϝϯςφϯε, هड़]͕༰қ5 5 http://xunitpatterns.com/Goals%20of%20Test%20Automation.html͔Βཁ໿ 14

Slide 15

Slide 15 text

هड़ ཧղ ϝϯςφϯε 15

Slide 16

Slide 16 text

·ͣ΍Δ͜ͱ class WorkingTimeCalculatorTest { @Test void ਖ਼ৗܥͷςετ() throws Exception { // (ུ) Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); WorkingTimeCalculator target = new WorkingTimeCalculator(targetUser, workingStartTime1, workingEndTime1, workingStartTime2, workingEndTime2); Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); CalculationResult result = target.getCaluculationResult(); assertEquals(720, result.getWorkTime()); List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); } } 16

Slide 17

Slide 17 text

͜Εͳʹͯ͠Δͷʁ class WorkingTimeCalculatorTest { @Test void ਖ਼ৗܥͷςετ() throws Exception { // (ུ) Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); WorkingTimeCalculator target = new WorkingTimeCalculator(targetUser, workingStartTime1, workingEndTime1, workingStartTime2, workingEndTime2); Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); CalculationResult result = target.getCaluculationResult(); assertEquals(720, result.getWorkTime()); List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); } } 17

Slide 18

Slide 18 text

ཧղʢղಡʣ͠Α͏ ͜ͷίʔυͬͯɺͦͷ೔ͷۈ຿࣌ؒΛೖΕͯɺ࿑ ಇ࣌ؒͱٳܜ࣌ؒΛܭࢉͯ͘͠ΕΔϝιουͳΜ ͩΑͶɻ ͜ͷςετͩͱɺҰ೔ೋճۈ຿͢Δ΍͔ͭͩΒɺ ࢝ۀबۀ࣌ؒΛෳ਺ೖΕͯςετͯ͠ΔͶɻٳܜ ͸ෳ਺ճܭࢉ͞ΕͯΔͶɻ — ϓϩμΫτઋਓ 18

Slide 19

Slide 19 text

ۈ຿࣌ؒͱٳܜ࣌ؒͷ ܭࢉςετΛ͍ͯ͠Δ 19

Slide 20

Slide 20 text

ͳʹΛͯ͠Δͷ͔Λ ςετ໊ʹ൓өͤ͞Δ class WorkingTimeCalculatorTest { @Test void ۈ຿࣌ؒͱٳܜ࣌ؒͷܭࢉςετ_ਖ਼ৗܥ() throws Exception { 20

Slide 21

Slide 21 text

໊લΛͳΔ΂͘۩ମతʹ class WorkingTimeCalculatorTest { @Test void _1೔ෳ਺ճۈ຿ͨ࣌͠ͷ_ۈ຿࣌ؒͱٳܜ࣌ؒͷܭࢉ() throws Exception { 21

Slide 22

Slide 22 text

with JUnit5! class WorkingTimeCalculatorTest { @DisplayName("ෳ਺ۈ຿ͨ͠ࡍͷۈ຿࣌ؒͷ߹ܭͱٳܜ͕࣌ؒܭࢉ͞ΕΔ΂͖⏰") @Test void workingTimeCalculation() throws Exception { 22

Slide 23

Slide 23 text

ߏ଄Խ͍ͯ͠ͳ͍ class WorkingTimeCalculatorTest { @DisplayName("1೔ʹෳ਺ۈ຿ͨ͠ࡍͷۈ຿࣌ؒͷ߹ܭͱٳܜ͕࣌ؒܭࢉ͞ΕΔ΂͖⏰") @Test void workingTimeCalculationTest() throws Exception { // (ུ) Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); WorkingTimeCalculator target = new WorkingTimeCalculator(targetUser, workingStartTime1, workingEndTime1, workingStartTime2, workingEndTime2); Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); CalculationResult result = target.getCaluculationResult(); assertEquals(720, result.getWorkTime()); List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); } } 23

Slide 24

Slide 24 text

ஈམΘ͚Λ͠Α͏ 24

Slide 25

Slide 25 text

4 phase test6 6 http://singapore2016.xunitpatterns.com/ 25

Slide 26

Slide 26 text

ߏ଄Խ͍Ζ͍Ζ 4 phase 3A7 BDD Spock setup arrange given given exercise act when - verify assert then expect teardown - - - 7 http://xp123.com/articles/3a-arrange-act-assert/ 26

Slide 27

Slide 27 text

Given-When-Then class WorkingTimeCalculatorTest { @DisplayName("1೔ʹෳ਺ۈ຿ͨ͠ࡍͷۈ຿࣌ؒͷ߹ܭͱٳܜ͕࣌ؒܭࢉ͞ΕΔ΂͖⏰") @Test void workingTimeCalculationTest() throws Exception { // given Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); // when WorkingTimeCalculator target = new WorkingTimeCalculator(targetUser, workingStartTime1, workingEndTime1, workingStartTime2, workingEndTime2); Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); CalculationResult result = target.getCaluculationResult(); // then assertEquals(720, result.getWorkTime()); List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); } } 27

Slide 28

Slide 28 text

Given // given Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); 28

Slide 29

Slide 29 text

When WorkingTimeCalculator target = new WorkingTimeCalculator(targetUser, workingStartTime1, workingEndTime1, workingStartTime2, workingEndTime2); Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); CalculationResult result = target.getCaluculationResult(); 29

Slide 30

Slide 30 text

Then // then assertEquals(720, result.getWorkTime()); List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); 30

Slide 31

Slide 31 text

Ͳ͔͜Βݟ͍ͯ͘ʁ • ͍ΖΜͳͱ͜ΖΛߦͬͨΓདྷͨΓ • ݸਓతʹ͸·ͣ͸Then͔Β 31

Slide 32

Slide 32 text

ෳ਺ͷΞαʔγϣϯ // then assertEquals(720, result.getWorkTime()); List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); 32

Slide 33

Slide 33 text

໰୊఺ • ΞαʔγϣϯϧʔϨοτ8 • ͲΕ͕མͪͨͷ͔Θ͔Βͳ͍ 8 http://xunitpatterns.com/Assertion%20Roulette.html 33

Slide 34

Slide 34 text

ରࡦ: γϯάϧΞαʔγϣϯ9 • ࿑ಇ࣌ؒܭࢉͷςετ // then assertEquals(720, result.getWorkTime()); • ٳܜ࣌ؒܭࢉͷςετ // then List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); 9 http://xunitpatterns.com/Principles%20of%20Test%20Automation.html#Single Condition Test 34

Slide 35

Slide 35 text

·ͱΊ͓͍ͯͨํ͕ Θ͔Γ΍ͦ͢͏ // then List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); 35

Slide 36

Slide 36 text

ಡΈ΍͍͢ܗʹ ϦϑΝΫλϦϯά • ྫ͑͹JUnit5 + AssertJΛར༻ // then List breakTimeList = result.getBreakTimeList(); assertThat(breakTimeList).hasSize(2).containsExactly(60, 45); 36

Slide 37

Slide 37 text

ΧελϜΞαʔγϣϯ10 • ϔϧύʔΛ࡞੒͠ɺΞαʔγϣϯͷ࣮ॲཧ͸ͦ ͪΒʹҠಈ 10 http://xunitpatterns.com/Custom%20Assertion.html 37

Slide 38

Slide 38 text

ϝιου೔ຊޠԽ΋ख // then List breakTimeList = result.getBreakTimeList(); ٳܜ͸2ճ෼ܭࢉ͞Εͯ(breakTimeList, _1ͭ໨ͷܭࢉ࣌ؒ͸(60), _2ͭ໨ͷܭࢉ࣌ؒ͸(45)); 38

Slide 39

Slide 39 text

ϝϯςφϯεੑ͕٘ਜ਼ʹͳ Δʁ • ςετͷڞ௨ԽͬͯͲΕ΄Ͳॏཁʁ • ͜ΕʹΑͬͯͲͷ͘Β͍ಡΈ΍͕͢͞૿͢ʁ 39

Slide 40

Slide 40 text

ಡΈ΍͘͢ͳΒͳ͍Α͏ͳΒ ΋͠ಡΈ΍͘͢ͳΒͳ͍ͳΒɺγϯάϧΞαʔγ ϣϯਥʹͳΔͭ΋Γ͸ͳ͍Α — Principle: Verify One Condition per Test 11 11 http://xunitpatterns.com/Principles%20of%20Test%20Automation.html#Single Condition Test ΑΓҙ༁ 40

Slide 41

Slide 41 text

Then͸׬ྃ // given Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); // when WorkingTimeCalculator target = new WorkingTimeCalculator(targetUser, workingStartTime1, workingEndTime1, workingStartTime2, workingEndTime2); Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); CalculationResult result = target.getCaluculationResult(); // then List breakTimeList = result.getBreakTimeList(); ٳܜ͸2ճ෼ܭࢉ͞Εͯ(breakTimeList, _1ͭ໨ͷܭࢉ࣌ؒ͸(60), _2ͭ໨ͷܭࢉ࣌ؒ͸(45)); 41

Slide 42

Slide 42 text

ଓ͍ͯWhen // when WorkingTimeCalculator target = new WorkingTimeCalculator(targetUser, workingStartTime1, workingEndTime1, workingStartTime2, workingEndTime2); Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); CalculationResult result = target.getCaluculationResult(); 42

Slide 43

Slide 43 text

ϦϑϨΫγϣϯʁ // when Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); 43

Slide 44

Slide 44 text

ςετର৅ͷprivateʹհೖ͠ ͍ͨ • ର৅ϝιουΛσϑΥϧτείʔϓʹ • Test-Specific SubclassΛར༻ 44

Slide 45

Slide 45 text

Test-Specific Subclass12 • ςετ༻ʹSUTͷαϒΫϥεΛ࡞੒͢Δ • Javaͩͱର৅ϝιουΛprotectedʹ 12 http://xunitpatterns.com/Test-Specific%20Subclass.html 45

Slide 46

Slide 46 text

Test-Specific Subclass12 // ςετ಺ʹϔϧύʔͱͯ͠ class WorkingCaluculatorForTest extends WorkingCaluculator { public calucuation() { super.caluculation(); } } // ςετଆ͸ݺͿ͚ͩ workingCalculator.calucuation(); 12 http://xunitpatterns.com/Test-Specific%20Subclass.html 46

Slide 47

Slide 47 text

When׬ྃ class WorkingTimeCalculatorTest { @DisplayName("1೔ʹෳ਺ۈ຿ͨ͠ࡍͷۈ຿࣌ؒͷ߹ܭͱٳܜ͕࣌ؒܭࢉ͞ΕΔ΂͖⏰") @Test void workingTimeCalculationTest() throws Exception { // given Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); // when workingCalculator.calucuation(); CalculationResult result = target.getCaluculationResult(); // then List breakTimeList = result.getBreakTimeList(); ٳܜ͸2ճ෼ܭࢉ͞Εͯ(breakTimeList, _1ͭ໨ͷܭࢉ࣌ؒ͸(60), _2ͭ໨ͷܭࢉ࣌ؒ͸(45)); } } 47

Slide 48

Slide 48 text

࠷ޙʹGiven // given Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); 48

Slide 49

Slide 49 text

ࣅͨΑ͏ͳσʔληοτ LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); 49

Slide 50

Slide 50 text

ͦ΋ͦ΋͜ͷςετʹඞཁͳ ৘ใʁ ͜ͷςετͩͱɺҰ೔ೋճۈ຿͢Δ΍͔ͭͩΒɺ ࢝ۀबۀ࣌ؒΛͦΕͧΕೖΕͯΔͶɻ — ϓϩμΫτઋਓ 50

Slide 51

Slide 51 text

Creation Method13 13 http://xunitpatterns.com/Creation%20Method.html 51

Slide 52

Slide 52 text

Creation Methodʹͯ͠ ෆཁ৘ใΛӅṭ LocalDateTime workingStartTime1 = createFirstWorkStartTime(); LocalDateTime workingEndTime1 = createFirstWorkEndTime(); LocalDateTime workingStartTime2 = createSecondWorkStartTime(); LocalDateTime workingEndTime2 = createSecondWorkEndTime(); 52

Slide 53

Slide 53 text

೔ຊޠʹ͢Δͷ΋ΞϦ LocalDateTime ࠷ॳͷۈ຿ͷ։࢝࣌ؒ = ࠷ॳͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(); LocalDateTime ࠷ॳͷۈ຿ͷऴྃ࣌ؒ = ࠷ॳͷۈ຿ͷऴྃ࣌ؒΛ࡞੒(); LocalDateTime ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒ = ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(); LocalDateTime ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒ = ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒΛ࡞੒(); 53

Slide 54

Slide 54 text

Given // given(ུ) Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime ࠷ॳͷۈ຿ͷ։࢝࣌ؒ = ࠷ॳͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(); LocalDateTime ࠷ॳͷۈ຿ͷऴྃ࣌ؒ = ࠷ॳͷۈ຿ͷऴྃ࣌ؒΛ࡞੒(); LocalDateTime ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒ = ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(); LocalDateTime ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒ = ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒΛ࡞੒(); 54

Slide 55

Slide 55 text

Ϣʔβʔͷ࡞੒΋ // given(ུ) Contract contract = new Contract(); User targetUser = new User(contract); ܖ໿಺༰Λ࡞੒Λ໌ࣔ͢Δඞཁ͸ͳ͍ // given User ਖ਼ࣾһͷϢʔβʔ = ਖ਼ࣾһͷϢʔβʔͷ࡞੒(); 55

Slide 56

Slide 56 text

Ұ࣌ม਺ඞཁʁ // given User ਖ਼ࣾһͷϢʔβʔ = ਖ਼ࣾһͷϢʔβʔͷ࡞੒(); LocalDateTime ࠷ॳͷۈ຿ͷ։࢝࣌ؒ = ࠷ॳͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(); LocalDateTime ࠷ॳͷۈ຿ͷऴྃ࣌ؒ = ࠷ॳͷۈ຿ͷऴྃ࣌ؒΛ࡞੒(); LocalDateTime ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒ = ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(); LocalDateTime ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒ = ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒΛ࡞੒(); WorkingTimeCalculator target = new WorkingTimeCalculatorForTest(ਖ਼ࣾһͷϢʔβʔ, ࠷ॳͷۈ຿ͷ։࢝࣌ؒ, ࠷ॳͷۈ຿ͷऴྃ࣌ؒ, ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒ, ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒ); 56

Slide 57

Slide 57 text

Ұ࣌ม਺Λফڈ // given WorkingTimeCalculator target = new WorkingTimeCalculatorForTest( ਖ਼ࣾһͷϢʔβʔͷ࡞੒(), ࠷ॳͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(), ࠷ॳͷۈ຿ͷऴྃ࣌ؒΛ࡞੒(), ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(), ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒΛ࡞੒()); 57

Slide 58

Slide 58 text

implicit setup14 class WorkingTimeCalculatorTest { WorkingTimeCalculator target = null; @BeforeEach void WorkingTimeCalculatorͷ࡞੒() { // given target = new WorkingTimeCalculatorForTest( ਖ਼ࣾһͷϢʔβʔͷ࡞੒(), ࠷ॳͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(), ࠷ॳͷۈ຿ͷऴྃ࣌ؒΛ࡞੒(), ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(), ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒΛ࡞੒()); } @DisplayName("ෳ਺ۈ຿ͨ͠ࡍͷۈ຿࣌ؒͷ߹ܭͱٳܜ͕࣌ؒܭࢉ͞ΕΔ΂͖⏰") 14 http://xunitpatterns.com/Implicit%20Setup.html 58

Slide 59

Slide 59 text

׬੒ class WorkingTimeCalculatorTest { WorkingTimeCalculator target = null; @BeforeEach void WorkingTimeCalculatorͷ࡞੒() { // given target = new WorkingTimeCalculatorForTest( ਖ਼ࣾһͷϢʔβʔͷ࡞੒(), ࠷ॳͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(), ࠷ॳͷۈ຿ͷऴྃ࣌ؒΛ࡞੒(), ೋͭ໨ͷۈ຿ͷ։࢝࣌ؒΛ࡞੒(), ೋͭ໨ͷۈ຿ͷऴྃ࣌ؒΛ࡞੒()); } @DisplayName("ෳ਺ۈ຿ͨ͠ࡍͷۈ຿࣌ؒͷ߹ܭͱٳܜ͕࣌ؒܭࢉ͞ΕΔ΂͖⏰") @Test void breakTimeCalculation() throws Exception { // when workingCalculator.calucuation(); CalculationResult result = target.getCaluculationResult(); // then List breakTimeList = result.getBreakTimeList(); ٳܜ͸2ճ෼ܭࢉ͞Εͯ(breakTimeList, _1ͭ໨ͷܭࢉ࣌ؒ͸(60), _2ͭ໨ͷܭࢉ࣌ؒ͸(45)); } } 59

Slide 60

Slide 60 text

࠷ॳͷ࣌ͱൺֱ͢Δͱ class WorkingTimeCalculatorTest { @Test void ਖ਼ৗܥͷςετ() throws Exception { // (ུ) Contract contract = new Contract(); User targetUser = new User(contract); LocalDateTime workingStartTime1 = LocalDateTime.of(2017, 9, 1, 10, 00); LocalDateTime workingEndTime1 = LocalDateTime.of(2017, 9, 1, 18, 00); LocalDateTime workingStartTime2 = LocalDateTime.of(2017, 9, 1, 22, 00); LocalDateTime workingEndTime2 = LocalDateTime.of(2017, 9, 2, 4, 00); WorkingTimeCalculator target = new WorkingTimeCalculator(targetUser, workingStartTime1, workingEndTime1, workingStartTime2, workingEndTime2); Class c = WorkingTimeCalculator.class; Method m = c.getDeclaredMethod("calculation", null); m.setAccessible(true); m.invoke(target, null); CalculationResult result = target.getCaluculationResult(); assertEquals(720, result.getWorkTime()); List breakTimeList = result.getBreakTimeList(); assertEquals(2, breakTimeList.size()); assertEquals(60, breakTimeList[0]); assertEquals(45, breakTimeList[1]); } } 60

Slide 61

Slide 61 text

ಡΈ΍͘͢ͳͬͨ @DisplayName("ෳ਺ۈ຿ͨ͠ࡍͷۈ຿࣌ؒͷ߹ܭͱٳܜ͕࣌ؒܭࢉ͞ΕΔ΂͖⏰") @Test void breakTimeCalculation() throws Exception { // when workingCalculator.calucuation(); CalculationResult result = sut.getCaluculationResult(); // then List breakTimeList = result.getBreakTimeList(); ٳܜ͸2ճ෼ܭࢉ͞Εͯ(breakTimeList, _1ͭ໨ͷܭࢉ࣌ؒ͸(60), _2ͭ໨ͷܭࢉ࣌ؒ͸(45)); 61

Slide 62

Slide 62 text

One more thing • ςετର৅ΛSUT(System Under Test)ͱهड़ ͢Δͷ͸xUTPจԽ15 CalculationResult result = sut.getCaluculationResult(); 15 http://xunitpatterns.com/SUT.html 62

Slide 63

Slide 63 text

·ͱΊʹ͔͑ͯ 63

Slide 64

Slide 64 text

͜͜·Ͱ ΍͖ͬͯͨ͜ͱ ʮಡΈ΍͍͢ʯ ςετࢤ޲ 64

Slide 65

Slide 65 text

ಡΈ΍͍͢ςετ • ॻ͖΍͍͢ • ཧղ͠΍͍͢ • ϝϯςφϯε͕༰қ 65

Slide 66

Slide 66 text

xUTPͰಡΈ΍͍͢ ςετΛ 66

Slide 67

Slide 67 text

ಡΈ΍͢͞Λຯํ ʹ͚ͭͯ͋ͳͨΛ ॿ͚ΔςετΛ 67

Slide 68

Slide 68 text

͓͠·͍ 68