Slide 1

Slide 1 text

TDDΛ͸͡Ίͭͭ ࢓ࣄͷ੒ՌΛग़͢ํ๏ @yashigani

Slide 2

Slide 2 text

@yashigani • iOS/Mac Application Engineer • Fenrir Inc. • http://yashigani.hatenablog.com • https://github.com/yashigani

Slide 3

Slide 3 text

εςοΧʔ͋͛·͢

Slide 4

Slide 4 text

agenda • TDDͱ͸ͳΜͧ΍ • ͳͥςετΛॻ͘ͷ͔ • ςετΛॻ͘ͱ஗͘ͳΔʁ • ܦݧஊ • BDD

Slide 5

Slide 5 text

TDD

Slide 6

Slide 6 text

Test Driven Development

Slide 7

Slide 7 text

ͳΜ͔೉ͦ͠͏ʂ

Slide 8

Slide 8 text

ͦΜͳ͜ͱແ͍ʂ

Slide 9

Slide 9 text

RED GREEN REFACTOR

Slide 10

Slide 10 text

Red Green Refactor • ςετΛॻ͍ͯམͪΔ͜ͱΛ֬ೝ • ςετ͕௨Δ࠷খݶͷ࣮૷͢Δ • ςετ͕௨ͬͨΒɼͦΕΛҡ࣋ͨ͠··
 ϦϑΝΫλϦϯά

Slide 11

Slide 11 text

ͦΕ͚ͩͰ TDD͸͸͡ΊΒΕΔʂ

Slide 12

Slide 12 text

͏Ε͍͜͠ͱ • 1αΠΫϧऴΘΔͱඞͣςετ͕࢒Δ • ࣍ͷมߋ࣌ʹ͸͜ΕΛ࢖ͬͯɼطଘͷ࣮૷Λյ ͍ͯ͠ͳ͍͔֬ೝ͢Δ͜ͱ͕Ͱ͖Δ • ਓ͕ؒ୳͢ͱΊΜͲ͍͘͜͞ͱΛػց೚ͤʹ • มߋ͠΍͍͢ίʔυʹͳΔ

Slide 13

Slide 13 text

ܕΛकΔ • ಛʹ1ͷαΠΫϧ͸େࣄ • ͨ·ʹؒҧͬͨςετΛॻ͍͍ͯΔ͜ͱ΋͋Δ • ׳Ε͖ͯͨΒɼ΍Γ΍͍͢Α͏ʹमਖ਼͢Δ • ͱ͸ݴͬͯ΋๨Ε͕ͪ…͋·ΓؾΛམͱ͞ͳ͍

Slide 14

Slide 14 text

ͳͥςετΛॻ͘ͷ͔

Slide 15

Slide 15 text

ςετΛॻ͘ཧ༝ • ࣮૷ͷϨΠϠͰ࢓༷Λ໌֬ʹ͢ΔͨΊ • ະདྷʹ௥Ճɾมߋ͢ΔͨΊ • ಈ࡞Λอূ͢ΔͨΊ • ࣮૷Λૣ͘ਐΊΔͨΊ

Slide 16

Slide 16 text

ςετΛॻ͘ͱ஗͘ͳΔ (޻਺͕૿͑Δ) ͷͰ͸ͳ͍͔ʁ

Slide 17

Slide 17 text

Ή͠Ζ଎͍৔߹΋͋Δ • ྫ͑͹APIΫϥΠΞϯτͷΑ͏ͳ΋ͷͷ࣮૷Λߟ ͑Δ • APIͱͷ௨৴෦Λॻ͍ͨ͋ͱͲ͏΍ͬͯಈ࡞֬ೝ Λ͢Δ͔ • UIΛ࡞͔ͬͯ֬ΊΔ • σόοά࣮ߦͯ͠ΈΔ

Slide 18

Slide 18 text

UIΛ࡞͔ͬͯ֬ΊΔ • ͦ΋ͦ΋UIͷ࣮૷ίετ͕ߴ͍ • ࢼ͢·Ͱʹ͕͔͔࣌ؒΔ • όάͷݪҼ੾Γ෼͚͕େม(UI or ϩδοΫ) • ࢼͤΔ͜Ζʹ͸ઈରͳʹ͔๨Ε͍ͯΔ

Slide 19

Slide 19 text

σόοά࣮ߦͯ͠ΈΔ • ͱΓ͋͑ͣίʔυͰݺͼग़ͯ͠Έͯɼࡉ͔͍͜ ͱ͸lldb͔Βೖྗ͢Δ • ਓ͕ؒຖճ৺ΛࠐΊͯίϚϯυΛೖྗ͢Δඞཁ ͸ແ͍ • ςετͳΒҰ౓ॻ͚͹Կ౓Ͱ΋܁Γฦ͠࢖͑Δ

Slide 20

Slide 20 text

ςετΛॻ͖ͭͭ εϐʔυΛ্͛Δ • ಉ͜͡ͱΛ܁Γฦ͢ͳΒςετ͕޲͍ͯΔ • ಛʹCIͰͷࣗಈςετ • ςετΛॻ͘ՕॴΛߜΔ • ॻ͍ͨΒ஗͘ͳΔՕॴͳΒॻ͔ͳ͍ • ςετͷϦλʔϯΛߟྀ͢Δ

Slide 21

Slide 21 text

։ൃ͕଎͘ͳΔ৔߹͸ ੵۃతʹςετΛॻ͘ • Model΍ෳࡶͳॲཧΛ࣮૷͢Δ৔߹ • ٯʹViewͷςετ͸ίετʹ߹Θͳ͍৔߹͕ଟ͍ • Modelʹൺ΂࢓༷มߋͷӨڹ͕ڧ͍ • Ͱ͖ͳ͍͜ͱ͸ແ͍ • ςετΛಋೖ͢ΔՕॴʹ͸ίετҙࣝΛ • ςετ΋ίʔυͳͷͰϝϯς͕ඞཁ

Slide 22

Slide 22 text

ಈ࡞Λ֬ೝ͢Δͷʹ࢖͏ • ৽͍͠API΍ϥΠϒϥϦͷڍಈΛ֬ೝ͢Δͱ͖ʹ • NSURLSessionࢼ͍ͨ͠ɼMantleࢼ͍ͨ͠ • ςετʹͯ͠࢒͓ͯ͘͠ͱޙʑ࢖͑Δ • OS ver͝ͱͷڍಈͷҧ͍Λݕূͨ͠Γ • αʔόΛStubͱຊ൪Λ੾Γସ͑ͯ…ͳͲ

Slide 23

Slide 23 text

ܦݧஊ (ࣦഊஊ)

Slide 24

Slide 24 text

ςετ͕ಈ͔ͳ͘ͳͬͨ·· ์ஔ͍ͯͨ͠ • ςετ͕ಈ͔ͳ͘ͳ͍͕ͬͯͨ௚͞ͳ͔ͬͨ • CIͷςετ࣮ߦͷδϣϒ͸εΫϦϓτͷ࣮ߦͷΈ Λ࡟আɼδϣϒ͸ͦͷ·· • ͦͷޙಈ͔ͳͨ͘͠ࣄ࣮Λ๨Εͯ͠·͍ɼςε τ͕࣮ߦ͞Ε͍ͯͳ͔ͬͨঢ়ଶͩͬͨ • ਖ਼͘͠ಈ͘ςετΛҡ࣋͢Δ

Slide 25

Slide 25 text

ॻ͍ͨ೔͔͠௨Βͳ͍ςετ Λॻ͍͍ͯͨ • աڈ30೔ͷϩάͷΈ࢒͢ɼͱ͍͏ػೳͷςετΛ ॻ͍͍ͯͨͱ͖ɼςετσʔλΛಛఆͷ೔͔Β 100೔௥Ճͨ͠ • ࣍ͷ೔ࢼ͢ͱςετ͕མͪΔΑ͏ʹͳ͍ͬͯͨ • ܧଓతʹςετΛ࣮ߦ͢Δඞཁੑ

Slide 26

Slide 26 text

ςετॻ͘ͷ΋ίετ • ಛʹෳࡶͳσʔλΛ࡞Δඞཁͷ͋Δςετ͸ॻ ͘ͷ͕ΊΜͲ͍͘͞ • Α͘Α͘ߟ͑Δͱɼςετॻ͔ͳ͍΄͏͕σόο ά͕ΊΜͲ͍͘͞ • ςετΛॻ͘ίετ < खಈͰςετ͢Δίετ

Slide 27

Slide 27 text

ͦͷ΄͔ྑ͍ͱײ͡Δ͜ͱ • ΤϥʔέʔεΛ࡞Δͷ͕Χϯλϯ • ෳࡶͳཁ݅Λঃʑʹ࣮૷͍ͯ͘͠ͷ͕༰қ • ςετ࣮ߦ࣌ʹϒϨʔΫϙΠϯτΛઃఆͰ͖Δ

Slide 28

Slide 28 text

BDD

Slide 29

Slide 29 text

Driven Development

Slide 30

Slide 30 text

BDD • Behavior Driven Development • TDDͷςετΛΑΓཁٻ࢓༷ʹ͍ۙܗͰදݱ • RSpecͱ͔Cucumberͱ͔ • ࣗવݴޠͬΆ͕͋ͬͯ͞ΧϫΠΠ

Slide 31

Slide 31 text

BDD framework • Kiwi • https://github.com/allending/Kiwi • Specta • https://github.com/specta/specta

Slide 32

Slide 32 text

- (void)testHREClient { TRVSMonitor *monitor = TRVSMonitor.monitor; [_client getStations:@"৽॓" completionHandler:^(NSArray *res, NSError *e) { XCTAssertNil(e, @":("); XCTAssertNotNil(res, @":("); [monitor signal]; }]; [monitor wait]; ! [_client getStations:@"ైԦொ" completionHandler:^(NSArray *res, NSError *e) { XCTAssertNotNil(e, @":("); XCTAssertNotNil(e.userInfo[@"error"], @":("); XCTAssertNil(res, @":("); [monitor signal]; }]; [monitor wait]; }

Slide 33

Slide 33 text

it(@“should found stations", ^{! TRVSMonitor *monitor = TRVSMonitor.monitor;! [client getStations:@"৽॓"! completionHandler:^(NSArray *res, NSError *e) {! [[e should] beNil];! [[res should] beNonNil];! [monitor signal];! }];! [monitor wait];! });! it(@“should not found stations", ^{! TRVSMonitor *monitor = TRVSMonitor.monitor;! [client getStations:@"ైԦொ"! completionHandler:^(NSArray *res, NSError *e) {! [[e should] beNonNil];! [[e.userInfo[@"error"] should] beNonNil];! [[res should] beNil];! [monitor signal];! }];! [monitor wait];! });

Slide 34

Slide 34 text

it(@"should found stations", ^AsyncBlock {! [client getStations:@"৽॓"! completionHandler:^(NSArray *res, NSError *e) {! expect(e).to.beNil();! expect(res).notTo.beNil();! done();! }];! });! it(@"should not found stations", ^AsyncBlock {! [client getStations:@"ైԦொ"! completionHandler:^(NSArray *res, NSError *e) {! expect(e).notTo.beNil();! expect(e.userInfo[@"error"]).notTo.beNil();! expect(res).to.beNil();! done();! }];! });

Slide 35

Slide 35 text

vs. XCTest/SenTestingKit • ࢖͏ͷʹηοτΞοϓ͕ඞཁ • ͨͩ͠CocoaPods࢖ͬͯΔ৔߹͸༨༟ • ϝιου୯ҐͰ࣮ߦͰ͖ͳ͍ • ѹ౗తʹՄಡੑ͕ߴ͍

Slide 36

Slide 36 text

·ͱΊ • ίετΛߟྀͭͭ͠ແཧͤͣಋೖ͢ΔͱΑ͍ • ΍ΔͳΒઈରʹCI·Ͱ(΋͘͠͸ܧଓతʹ࣮ߦ͠ ΍͍͢؀ڥΛ࡞Δ) • ҙࣝߴΊͯ1िؒ͘Β͍΍ͬͯΈͨΒ਎ʹ͔ͭ͘ Βɼ͸͡ΊΔͳΒҙࣝߴ·ͬͨࠓʂ

Slide 37

Slide 37 text

ࢀߟ • https://github.com/yashigani/HREClient • Ӻ৘ใΛऔಘ͢Δ؆қͳΫϥΠΞϯτ • ࠓ೔঺հͨ͠ςετΛஔ͍ͯ͋Γ·͢

Slide 38

Slide 38 text

͋Γ͕ͱ͏͍͟͝·ͨ͠