Slide 1

Slide 1 text

υϝΠϯϩδοΫͱ ӬଓԽॲཧΛ෼཭͢Δઃܭվળ ΛߦͬͯಘΒΕͨ஌ݟ "LBUTVLJ4VNNFS*OUFSOTIJQ੒Ռൃද ؛ ௚ً !QBTT

Slide 2

Slide 2 text

࿩͍ͨ͜͠ͱ ࠜڌͷ͋Δઃܭ͸ଟ͘ͷϝϦο τΛڗडͰ͖Δ

Slide 3

Slide 3 text

8IPBN* • ؛ ௚ً • 5XJUUFS (JU)VC!QBTT • ژ౎େֶ # • αʔόʔαΠυ (P • $".1)03 ӡӦϝϯόʔ ࣗݾ঺հ

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

"HFOEB • ࣗݾ঺հ • Ծ૝௨՟؅ཧαʔϏεͷ঺հ • ઃܭվળΛߦ͏ܦҢ • ݱঢ়ͷ՝୊ • ઃܭվળ • ઃܭվળͰಘΒΕͨϝϦοτ • ݸਓతͳֶͼ • ͓ΘΓʹ

Slide 6

Slide 6 text

Ծ૝௨՟؅ཧαʔϏεͷ ঺հ

Slide 7

Slide 7 text

֓ཁ • ήʔϜ಺௨՟؅ཧαʔϏε • ՝ۚΞΠςϜͷ؅ཧ • Ϣʔβͷ࢒ߴ؅ཧ • Ϩγʔτݕূ • FUD Ծ૝௨՟؅ཧαʔϏεͷ঺հ ήʔϜ։ൃऀͷ޻਺࡟ݮʹد༩

Slide 8

Slide 8 text

࢖ΘΕ͍ͯΔٕज़ελοΫ • (P • (PPHMF"QQ&OHJOF ("& • EBUBTUPSF • $JSDMF$* Ծ૝௨՟؅ཧαʔϏεͷ঺հ (PQIFSJ[FNF IUUQTHPQIFSJ[FNF

Slide 9

Slide 9 text

ઃܭվળΛߦ͏ܦҢ

Slide 10

Slide 10 text

ϥΠϒϥϦΛมߋ͍ͨ͠ ݱࡏ͸EBUBTUPSF΁ͷΞΫηεʹ NKJCTPOHPPOΛ࢖༻ • ("&ެࣜͷϥΠϒϥϦΛ͍͍ײ͡ʹϥοϓ • ࣗಈΩϟογϡ ࢖͍উखͷྑͦ͞͏ͳ NFSDBSJEBUBTUPSFʹҠߦ͍ͨ͠ • ಠࣗʹϛυϧ΢ΣΞΛ࣮૷͢Δ͜ͱ͕Ͱ͖Δ • ֦ுੑ͕ߴ͍ ઃܭվળΛߦ͏ܦҢ

Slide 11

Slide 11 text

ݱঢ়ͷ՝୊

Slide 12

Slide 12 text

ີ݁߹ͳυϝΠϯ૚ ϩδοΫͱEBUBTUPSF΁ͷӬଓԽॲཧ͕ࠞ͟Γ߹ͬͯෳࡶ ݱঢ়ͷ՝୊ Is the change list more complex than it should be? "Too complex" usually means "can't be understood quickly by code readers." (PPHMFT&OHJOFFSJOH1SBDUJDFTEPDVNFOUBUJPOIUUQTHPPHMFHJUIVCJPFOHQSBDUJDFT

Slide 13

Slide 13 text

6OJUUFTUT*OUFHSBUJPOUFTUT • ϩδοΫͷςετ͕͍ͨ͠ͷʹΤϛϡϨʔλͷىಈ͕ඞཁ • ΧόϨοδ͸ߴ͍͕໢ཏੑ͕௿͍ • Ξϯνύλʔϯ ݱঢ়ͷ՝୊ Unit Integration E2E UFTUBVUPNBUJPOQZSBNJE

Slide 14

Slide 14 text

ઃܭվળͷํ਑

Slide 15

Slide 15 text

ີ݁߹ͳॲཧΛ෼཭͢Δ ✔ ͜ΕΒͷ໰୊͸ີ݁߹ͳ࣮૷ʹىҼ ˣ ૄ݁߹ͳ࣮૷ʹͳΔΑ͏ʹઃܭΛมߋ ઃܭվળ

Slide 16

Slide 16 text

%*1ͱΠϯλʔϑΣʔεͰந৅Խ ઃܭվળ IUUQTTQFBLFSEFDLDPNQMVTDMFBOBSDIJUFDUVSFJONJOVUFT TMJEF

Slide 17

Slide 17 text

࣮૷ ઃܭվળ "EEJUJPOT%FMFUJPOT$IBOHFT

Slide 18

Slide 18 text

࣮૷ ઃܭվળ

Slide 19

Slide 19 text

ઃܭվળͰಘΒΕͨ ϝϦοτ

Slide 20

Slide 20 text

ςελϏϦςΟͷ޲্ ϞοΫΛ࢖͏͜ͱͰςετ͕ॻ͖΍͘͢ ઃܭվળͰಘΒΕͨϝϦοτ { name: "return error when post failed", hoge: &types.Hoge{ HogeID: "invalid” }, injector: func(r *mocks.MockHogeRepository) *mocks.MockHogeRepository { r.EXPECT().Post(gomock.Any(), types.Hoge{HogeID: "invalid"}). Return(nil, errors.New("some error")) return r }, want: nil, wantErr: true, } // ... for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() mockRepo := mocks.NewMockHogeRepository(ctrl) mockRepo = tt.injector(mockRepo) // ... } }

Slide 21

Slide 21 text

ίʔυͷՄಡੑ͕޲্ ӬଓԽॲཧΛએݴతʹݺͿ͚ͩͰྑ͍ͷͰίʔυ͕͖ͬ͢Γ • ԿΛ͢ΔͨΊͷؔ਺ͳͷ͔͕෼͔Γ΍͍͢ ઃܭվળͰಘΒΕͨϝϦοτ

Slide 22

Slide 22 text

%#ͷҠߦָ͕ʹ ผ%# FY4QBOOFS ΁ͷҠߦ࣌ʹϩδοΫΛߟ͑Δඞཁ͕ͳ͍ ઃܭվળͰಘΒΕͨϝϦοτ

Slide 23

Slide 23 text

ݸਓతͳֶͼ

Slide 24

Slide 24 text

ࠜڌͷ͋Δઃܭ͸ଟ͘ͷ ϝϦοτΛڗडͰ͖Δ

Slide 25

Slide 25 text

ઃܭͷଘࡏҙٛ ΞʔΩςΫνϟ΍ઃܭख๏͸Կ͔Λղܾ͢ΔͨΊʹੜ·Εͨ • ςετ͕ॻ͖ͮΒ͍ • େن໛ʹͳͬͯ։ൃεϐʔυ͕མͪͨ • FUD ࣗ෼ͷϓϩμΫτͱઃܭख๏ͷ໨త͕Ұக͍ͯ͠ͳ͍ͱແҙຯ ݸਓతͳֶͼ

Slide 26

Slide 26 text

lͳΜͱͳ͘zͰ͸ͳࠜ͘ڌΛ΋ͬͨઃܭΛ ໨తҙࣝΛ΋ͬͯద੾ͳબఆΛ͠Α͏ • ςετ࣌ؒ୹ॖͷͨΊʹ%#ΛϞοΫʹࠩ͠ସ͍͔͑ͨΒந৅Խ͢Δ • େن໛ͳ։ൃ͔ͩΒɺ੹຿Λ෼཭Ͱ͖ΔΑ͏ʹ$MFBO"SDIJUFDUVSFΛ ࠾༻͢Δ • কདྷੑΑΓ΋։ൃεϐʔυ͕େࣄ͔ͩΒ͋·ΓઃܭΛؾʹ͠ͳ͍ • FUD ݸਓతͳֶͼ

Slide 27

Slide 27 text

͓ΘΓʹ

Slide 28

Slide 28 text

͓ΘΓʹ • ήʔϜ಺௨՟؅ཧαʔϏεͷઃܭվળΛߦͬͨ • طଘͷ՝୊఺Λղফͯ͠ࠓޙͷ։ൃ͕͠΍͘͢ͳΔΑ͏ʹͨ͠ • ࣮͸ଞʹ΋৭Μͳ͜ͱΛɺɺɺ • ZBNM ͔Β (PͷςετίʔυΛࣗಈੜ੒͢Δ044ͷ৽ػೳ։ൃ • ෼ࢄΩϟογϡͨΊͷϛυϧ΢ΣΞΛ࣮૷ • FUD

Slide 29

Slide 29 text

5IBOLZPV "TLNFBOZUIJOH 5XJUUFS΀Β͢ !QBTT (JU)VCQBTT