当前位置: 首页 > 后端技术 > PHP

UnittestingwithGomock

时间:2023-03-30 01:04:23 PHP

鍘熸枃鍦板潃锛歎nittestingwithGomock鍓嶈█鍦ㄥ疄闄呴」鐩腑锛岄渶瑕佽繘琛屽崟鍏冩祴璇曠殑鏃跺€欍€備絾鏄粡甯稿彂鐜版湁寰堝渚濊禆銆傝繖灏辨槸Gomock澶ф樉韬墜鐨勬椂鍊欎簡銆俫omock鏄疓o璇█鐨刴ock妗嗘灦锛屽畼鏂圭殑馃おinstall$goget-ugithub.com/golang/mock/gomock$goinstallgithub.com/golang/mock/mockgen1銆佺涓€姝ワ細鎴戜滑绗笁姝ュ畨瑁単omock-party搴撳拰mockgen锛宮ock浠g爜鐨勭敓鎴愬伐鍏枫€傚悗鑰呭彲浠ュぇ澶ц妭鐪佹垜浠殑宸ヤ綔閲忋€備綘鍙渶瑕佺煡閬撳浣曚娇鐢ㄥ畠銆?.绗簩姝ワ細杈撳叆mockgen锛岄獙璇佷唬鐮佺敓鎴愬伐鍏锋槸鍚﹀畨瑁呮纭€傚鏋滀笉鑳芥甯稿搷搴旓紝璇锋鏌in鐩綍涓嬫槸鍚︽湁浜岃繘鍒舵枃浠躲€傜敤娉曞湪mockgen鍛戒护涓紝鏀寔涓ょ鐢熸垚鏂瑰紡锛?.source锛氫粠婧愭枃浠剁敓鎴恗ock鎺ュ彛锛堢敱-source鍚敤锛塵ockgen-source=foo.go[鍏朵粬閫夐」]2.reflect锛氫娇鐢ㄥ弽鎬濊鍒掋€傚畠閫氳繃浼犻€掍袱涓潪鏍囧織鍙傛暟鏉ュ惎鐢細瀵煎叆璺緞鍜岄€楀彿鍒嗛殧鐨勬帴鍙e垪琛╩ockgendatabase/sql/driverConn,Driver鏈川涓婏紝杩欎袱绉嶆柟娉曠敓鎴愮殑mock浠g爜娌℃湁鍖哄埆銆傛墍浠ラ€夋嫨鍚堥€傜殑锛屽啓娴嬭瘯鐢ㄤ緥銆傚湪杩欑瘒鏂囩珷涓紝鎴戝皢妯℃嫙涓€涓畝鍗曠殑Demo鏉ョ紪鍐欐祴璇曠敤渚嬨€傛垜浼氱啛鎮夋暣涓祴璇曟祦绋嬫楠ゃ€傛兂娓呮鏁翠綋鐨勯€昏緫锛屽畾涔夋兂瑕佺殑锛堟ā鎷熺殑锛変緷璧栫殑鎺ュ彛锛坕nterface锛夈€備娇鐢╩ockgen鍛戒护淇敼鎵€鏈夐渶瑕乵ock鐨勬帴鍙o紝鐢熸垚mock鏂囦欢缂栧啓鍗曞厓娴嬭瘯鐨勯€昏緫锛屽湪娴嬭瘯涓娇鐢╩ock浣滀负鍗曞厓娴嬭瘯鐨勯獙璇佺洰褰曗敎鈹€鈹€mock鈹溾攢鈹€person鈹傗敂鈹€鈹€male.go鈹斺攢鈹€user鈹溾攢鈹€user.go鈹斺攢鈹€user_test.go缂栧啓鎺ュ彛鏂规硶鎵撳紑person/male.go鏂囦欢锛屽啓鍏ュ涓嬪唴瀹癸細packagepersontypeMaleinterface{Get(idint64)error}璋冪敤鏂规硶鎵撳紑user/user.go鏂囦欢锛屽啓鍏ュ涓嬪唴瀹癸細{return&User{Person:p}}func(u*User)GetUserInfo(idint64)error{returnu.Person.Get(id)}鐢熸垚mock鏂囦欢鍥炲埌mockd/鏍圭洰褰曪紝鎵ц濡備笅鍛戒护$mockgen-source=./person/male.go-destination=./mock/male_mock.go-package=mock鎵ц鍚庡彲浠ュ彂鐜癿ock/鐩綍涓嬪浜嗕竴涓猰ale_mock.go鏂囦欢锛屽氨鏄痬ockF宀涖€傞偅涔堝懡浠や腑鐨勬寚浠ゆ湁浠€涔堢敤鍛紵濡備笅锛?source锛氳缃渶瑕佹ā鎷熺殑鎺ュ彛鏂囦欢锛坢ock锛?destination锛氳缃甿ock鏂囦欢杈撳嚭鐨勫湴鏂癸紝濡傛灉涓嶈缃紝鍒欐墦鍗板埌鏍囧噯杈撳嚭-package锛氳缃寘鍚峬ock鏂囦欢鐨勫悕绉帮紝濡傛灉涓嶈缃紝浼氬湪mock_鏂囦欢鍚嶅墠鍔犲墠缂€锛堟瘮濡傛湰鏂囩殑鍖呭悕浼氭槸mock_person锛夈€傛洿澶氳鏄庤鍙傝€冨畼鏂规枃妗h緭鍑虹殑mock鏂囦欢//CodegeneratedbyMockGen銆侱ONOTEDIT.//Source:./person/male.go//Packagemock鏄竴涓敓鎴愮殑GoMockpackage.packagemockimport(gomock"github.com/golang/mock/gomock"reflect"reflect")//MockMale鏄竴涓猰ockofMaleinterfacetypeMockMalestruct{ctrl*gomock.Controllerrecorder*MockMaleMockRecorder}//MockMaleMockRecorder鏄疢ockMaletype鐨刴ock璁板綍鍣∕ockMaleMockRecorderstruct{mock*MockMale}//NewMockMale鍒涘缓涓€涓柊鐨刴ockinstancefuncNewMockMale(ctrl*gomock.Controller)*MockMale{mock:der=&MockMale{ctrl:ctrl}mockcor.recorder=&MockMaleMockRecorder{mock}returnmock}//EXPECT杩斿洖涓€涓璞★紝鍏佽璋冪敤鑰呮寚绀洪鏈熺殑usefunc(m*MockMale)EXPECT()*MockMaleMockRecorder{returnm.璁板綍der}//鑾峰彇妯℃嫙鍩虹鏂规硶func(m*MockMale)Get(idint64)error{ret:=m.ctrl.Call(m,"Get",id)ret0,_:=ret[0].(error)returnret0}//Get琛ㄧず棰勬湡璋冪敤Getfunc(mr*MockMaleMockRecorder)Get(idinterface{})*gomock.Call{returnmr.mock.ctrl.RecordCallWithMethodType(mr.mock,"Get",reflect.TypeOf((*MockMale)(nil).Get),id)}娴嬭瘯鐢ㄤ緥鎵撳紑user/user_test.go鏂囦欢锛屽啓鍏ュ涓嬪唴瀹癸細com/golang/mock/gomock")funcTestUser_GetUserInfo(t*testing.T){ctl:=gomock.NewController(t)deferctl.Finish()varidint64=1mockMale:=mock.NewMockMale(ctl)gomock銆侷nOrder(mockMale.EXPECT().Get(id).Return(nil),)user:=NewUser(mockMale)err:=user.GetUserInfo(id)iferr!=nil{t.Errorf("user.GetUserInfo閿欒:%v",err)}}gomock.NewController锛氳繑鍥瀏omock.Controller锛屼唬琛╩ock鐢熸€佺郴缁熶腑鐨勯《绾ф帶浠讹紝瀹氫箟浜嗕綔鐢ㄥ煙銆佺敓鍛藉懆鏈熷拰鏈熸湜鍊兼ā鎷熷璞$殑UE銆傛澶栵紝瀹冩槸澶氫釜goroutine涓殑瀹夊叏妯℃嫙銆侼ewMockMale:Createanewmockinstancegomock.InOrder:澹版槑缁欏畾鐨勮皟鐢ㄥ簲璇ユ寜椤哄簭杩涜锛堝gomock.After鐨勪簩娆″皝瑁咃級mockMale.EXPECT()銆侴et(id).Return(nil)锛氳繖閲屽垎涓夋锛孍XPECT()杩斿洖涓€涓璞★紝鍏佽璋冪敤鑰呰缃湡鏈涘拰杩斿洖鍊笺€俫et(id)鏄缃叆鍙傦紝璋冪敤mock瀹炰緥涓殑鏂规硶銆俽eturn(nil)鏄缃箣鍓嶈皟鐢ㄧ殑鏂规硶鐨勫弬鏁般€傜畝鍗曟潵璇村氨鏄缃叆鍙傚拰璋冪敤锛屾渶鍚庤缃繑鍥炲€糔ewUser(mockMale):鍒涘缓涓€涓猆ser瀹炰緥銆傚€煎緱娉ㄦ剰鐨勬槸锛岃繖閲屾敞鍏ョ殑鏄痬ock瀵硅薄锛屾墍浠ュ湪鍚庣画鐨剈ser.GetUserInfo(id)涓疄闄呰皟鐢ㄧ殑鏄紙input鎸囩殑鏄細id涓?锛夈€傚畠璋冪敤浜嗘垜浠簨鍏堟ā鎷熷ソ鐨刴ock鏂规硶ctl.Finish()锛氭柇瑷€mock鐢ㄤ緥鐨勯鏈熷€硷紝涓€鑸娇鐢╠efer鏉ュ欢杩熸墽琛岋紝闃叉鎴戜滑蹇樿杩欎釜鎿嶄綔銆傛祴璇曞洖鍒癿ockd/鏍圭洰褰曪紝鎵ц濡備笅鍛戒护$gotest./userokgithub.com/EDDYCJY/mockd/user鐪嬪埌杩欎釜缁撴灉锛屽ぇ鍔熷憡鎴愶紒鍙互鑷繁璋冩暣Return()鐨勮繑鍥炲€煎緱鍒颁笉鍚岀殑娴嬭瘯缁撴灉馃槃鏌ョ湅娴嬭瘯鎯呭喌娴嬭瘯瑕嗙洊鐜?gotest-cover./userokgithub.com/EDDYCJY/mockd/user(cached)coverage:100.0%ofstatements浣犲彲浠ラ€氳繃璁剧疆-cover鏍囧織寮€鍚鐩栫巼缁熻锛屾樉绀哄唴瀹逛负coverage:100.0%銆傚彲瑙嗗寲鐣岄潰1.鐢熸垚娴嬭瘯瑕嗙洊鐜囩殑profile鏂囦欢$gotest./...-coverprofile=cover.out2.浣跨敤profile鏂囦欢鐢熸垚鍙鍖栫晫闈?gotoolcover-html=cover.out3.妫€鏌ュ彲瑙嗗寲鐣岄潰鍙婅鐩栫巼鍒嗘瀽More1.甯哥敤mock鏂规硶璋冪敤鏂规硶Call.Do()锛氬0鏄庡尮閰嶆椂瑕佽繍琛岀殑鎿嶄綔Call.DoAndReturn()锛氬0鏄庡尮閰嶈皟鐢ㄦ椂瑕佽繍琛岀殑鎿嶄綔锛屾ā鎷熻繑鍥炲嚱鏁扮殑鍊糃all.MaxTimes()锛氳缃渶澶ц皟鐢ㄦ鏁颁负n娆all.MinTimes()锛氳缃渶灏忚皟鐢ㄦ鏁颁负n娆all.AnyTimes()锛氬厑璁歌皟鐢ㄦ鏁颁负0娆℃垨澶氭call.Times()锛氳缃皟鐢ㄦ鏁癿atchgomock.Any()forn娆″弬鏁帮細鍖归厤浠绘剰鍊糶omock.Eq()锛氶€氳繃鍙嶅皠鍖归厤鍒版寚瀹氱被鍨嬪€硷紝鏃犻渶鎵嬪姩璁剧疆gomock.Nil()锛歳eturnnil寤鸿鏇村鏂规硶鍙互鍙傝€冨畼鏂规枃妗?.鐢熸垚澶氫釜Mock鏂囦欢浣犲彲鑳芥兂涓€涓竴涓敓鎴恗ock鏂囦欢涓€銆佷负浠€涔堜笉宕╂簝锛熷綋鐒跺畼鏂规彁渚涗簡鏇存柟渚跨殑鏂瑰紡锛屾垜浠彲浠ヤ娇鐢╣o:generate鏉ュ畬鎴愭壒澶勭悊鍔熻兘gogenerate[-runregexp][-n][-v][-x][buildflags][file.go...|packages]淇敼鎺ュ彛鏂规硶鎵撳紑person/male.go鏂囦欢锛屼慨鏀逛负濡備笅鍐呭锛歱ackageperson//go:generatemockgen-destination=../mock/male_mock.go-package=mockgithub.com/EDDYCJY/mockd/personMaletypeMaleinterface{get(idint64)error}鎴戜滑娉ㄦ剰go:generate杩欎釜璇彞锛屽彲浠ュ垎涓轰互涓嬪嚑涓儴鍒嗭細璇彞//go:generate锛堟敞鎰忎笉瑕佺暀绌烘牸锛変娇鐢╩ockgen鍛戒护瀹氫箟-destinationdefinition-packagedefinessource锛岃繖閲屽畾涔塸erson鍖呰矾寰勭殑鎺ュ彛锛岃繖閲屼负Male閲嶆柊鐢熸垚mock鏂囦欢骞惰繑鍥瀖鍦╫ckd/鐨勬牴鐩綍涓嬶紝鎵ц濡備笅鍛戒护$gogenerate./...鐒跺悗鏌ョ湅mock/锛屽彂鐜板凡缁忔纭敓鎴愪簡銆傚涓枃浠剁殑鏃跺€欎笉鏄緢鏂逛究鍚楋紵鍗曞厓娴嬭瘯閾炬帴閲屾湁鎬荤粨锛実omock缁欐垜浠彁渚涗簡寰堝ぇ鐨勬柟渚匡紝鍙互mock寰堝渚濊禆锛屼娇鐢ㄦ柟娉曞拰鍔熻兘涔熷緢澶氥€傚彲浠ヨ缁嗘爣娉ㄧ湅瀹樻柟鏂囨。锛岃蹇嗕細鏇存繁