Slide 1

Slide 1 text

ModelΛ LayerͰ෼͚ͯ Unit Testͷ؍఺Λ໌֬͢Δ potatotips #59

Slide 2

Slide 2 text

About me • Name: ͔Ή͍ (Twitter: @kamui_project) • Company: DMM.com • App: MENUS • Community: ϖϯΪϯଜ

Slide 3

Slide 3 text

No content

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

I will tell you …

Slide 6

Slide 6 text

Unit Tests for iOS

Slide 7

Slide 7 text

No content

Slide 8

Slide 8 text

No content

Slide 9

Slide 9 text

We implemented unit testing like this …

Slide 10

Slide 10 text

HogeTests Hoge

Slide 11

Slide 11 text

Architecture • GUI Architecture -> MVVM • System Architecture -> Layered Architecture

Slide 12

Slide 12 text

Testability! RxSwift! DDD! CI/CD! Availability! Readability! Maintainability! Scalability! XcodeGen! All Swift!

Slide 13

Slide 13 text

EoT(Ease of Testing)! RxSwift! DDD! CI/CD! Availability! Readability! Maintainability! Scalability! XcodeGen! All Swift!

Slide 14

Slide 14 text

Layered Architecture IUUQTMJUUMFIBOETIBUFOBCMPHDPNFOUSZEEEBSDIJUFDUVSF Ҿ༻৽ଔʹ΋఻ΘΔυϝΠϯۦಈઃܭͷΞʔΩςΫνϟઆ໌<%%%>

Slide 15

Slide 15 text

Layer • Presentation: ViewModel • Domain: Service • UseCase: UseCase • Infrastructure: Repository

Slide 16

Slide 16 text

Layer • Presentation: ViewModel • Domain: Service • UseCase: UseCase • Infrastructure: Repository Tests Tests Tests Tests

Slide 17

Slide 17 text

Code Example - User Information -

Slide 18

Slide 18 text

UserViewModel ը໘ϩʔυ࣌ʹ6TFS৘ใΛऔಘ͠ը໘ʹ6TSF৘ใΛ౉͢ GVODVTFS8JUI7JFX8JMM"QQFBS \ JOQVUT WJFX8JMM"QQFBSBT0CTFSWBCMF TVCTDSJCF PO/FYU\ JO TFMG EFQFOEFODJFTHFU6TFS6TF$BTFFYFDVUF NBQ $POWFSUFSTIBSFEDPOWFSU5P6TFS #JOEJOH%BUB TVCTDSJCF PO4VDDFTT\ VTFS#JOEJOH%BUB JO TFMG VTFS3FMBZBDDFQU VTFS#JOEJOH%BUB ^ EJTQPTFE CZTFMG EJTQPTF#BH ^ EJTQPTFE CZEJTQPTF#BH ^

Slide 19

Slide 19 text

දࣔʹ͓͚Δؔ৺ࣄ Presentation:

Slide 20

Slide 20 text

UserViewModelTests GVODUFTUը໘ϩʔυ࣌ʹ6TFS৘ใΛऔಘ͠ը໘ʹ6TSF৘ใΛ౉͢͜ͱ \ MFUVTFS6TFS)FMQFSTIBSFEVTFS $VDLPPͰελϒੜ੒ TUVC NPDL(FU6TFS6TF$BTF \ QSPYZ JO XIFO QSPYZFYFDVUF UIFO3FUVSO KVTU VTFS ^ EP\ MFUVTFS#JOEJOH%BUBTVCKFDUPVUQVUVTFS#JOEJOH%BUBBT0CTFSWBCMF TIBSF SFQMBZ TDPQFXIJMF$POOFDUFE VTFS#JOEJOH%BUBTVCTDSJCF EJTQPTFE CZEJTQPTF#BH ը໘දࣔ WJFX8JMM"QQFBS3FMBZBDDFQU USVF MFUFWFOUUSZVTFS#JOEJOH%BUBUBLF UP#MPDLJOH UP"SSBZ 9$5"TTFSU&RVBM FWFOUDPVOU ^DBUDI\ 9$5'BUJM ^ ^

Slide 21

Slide 21 text

UserUseCase 6TFS৘ใऔಘॲཧΛ࣮ߦ GVODFYFDVUF 4JOHMF6TFS\ SFUVSOVTFS3FQPTJUPSZpOE ^

Slide 22

Slide 22 text

Presentation૚ͷͨΊͷDomainૢ࡞ʹ͓͚Δؔ৺ࣄ UseCase: ※(Evansຊ)Ͱ͸Application૚ͱ঺հ͞Ε͍ͯ·͕͢ɺDomainObjectͷ஋Λૢ࡞͠ͳ͍ɾӬଓԽ΁ͷӨڹ ͷ͋Δૢ࡞Λ͠ͳ͍ͱ͍͏఺Ͱ໨త͸ࣅ͍ͯ·͢

Slide 23

Slide 23 text

UserUseCaseTests GVODUFTU6TFS৘ใऔಘॲཧΛ࣮ߦ͢Δ͜ͱ \ MFUVTFS6TFS)FMQFSTIBSFEVTFS $VDLPPͰελϒੜ੒ TUVC NPDL6TFS3FQPTJUPSZ \ QSPYZ JO XIFO QSPYZpOE UIFO3FUVSO KVTU VTFS ^ MFUFYFDVUFTVCKFDUFYFDVUF BT0CTFSWBCMF TIBSF SFQMBZ TDPQFXIJMF$POOFDUFE FYFDVUFTVCTDSJCF EJTQPTFE CZEJTQPTF#BH EP\ MFUVTFSUSZFYFDVUFUBLF UP#MPDLJOH MBTU 9$5"TTFSU/PU/JM VTFS 9$5"TTFSU&RVBM VTFSJE 9$5"TTFSU&RVBM VTFSOBNF l͔Ή͍z 9$5"TTFSU&RVBM VTFSBHF ^DBUDI\ 9$5'BJM ^ ^

Slide 24

Slide 24 text

UserRepository 6TFS৘ใΛ6TFS"QJʹ໰͍߹Θͤͯऔಘ͢Δ GVODpOE 4JOHMF6TFS\ SFUVSO6TFS"QJ(FU6TFS SYTFOE NBQ \SFTQPOTF6TFSJO SFUVSO6TFS JE6TFS*E JESFTQPOTFJE OBNFSFQPOTFOBNF BHFSFTQPOTFBHF ^ ^

Slide 25

Slide 25 text

ӬଓԽʹ͓͚Δؔ৺ࣄ Infrastructure:

Slide 26

Slide 26 text

UserRepositoryTests PWFSSJEFGVODTFU6Q \ .PDLJOHKBZͰελϒੜ੒ TUVC IUUQ HFU VSJ4USJOHlVTFSTl KTPO <lJEz dׂѪd> ^ GVODUFTU6TFS৘ใΛ6TFS"QJʹ໰͍߹Θͤͯऔಘ͢Δ͜ͱ \ MFUVTFS6TFS)FMQFSTIBSFEVTFS MFUpOETVCKFDUpOE BT0CTFSWBCMF TIBSF SFQMBZ TDPQFXIJMF$POOFDUFE pOETVCTDSJCF EJTQPTFE CZEJTQPTF#BH MFUFYQFYQFDUBUJPO EFTDSJQUJPOlz EP\ MFUVTFSUSZpOEUBLF UP#MPDLJOH TJOHMF 9$5"TTFSU/PU/JM VTFS 9$5"TTFSU&RVBM VTFSJE ddׂѪdd ^DBUDI\ 9$5'BUJM ^ ^

Slide 27

Slide 27 text

Conclusion • Before: Point of view? • After: ɹArchitcture-pattern -> Modeling -> Carify Responsibility ->

Slide 28

Slide 28 text

In the end • We’re Hiring!!! -> Especially, Developer! • Firstly… Let’s have lunch together!

Slide 29

Slide 29 text

Thank you!