前端測(cè)試的反模式 | IDCF

來(lái)源:Thoughtworks洞見(jiàn) 作者:鐘立?
一、過(guò)于關(guān)注實(shí)現(xiàn)細(xì)節(jié)的測(cè)試
在為前端項(xiàng)目編寫(xiě)測(cè)試用例的時(shí)候,你也許和我一樣,曾遇到過(guò)以下困擾:
明明進(jìn)行了功能正確的改動(dòng),測(cè)試卻掛了。修復(fù)測(cè)試有時(shí)候得認(rèn)真閱讀各種mock的細(xì)節(jié),或者去了解很多本沒(méi)有必要知道的代碼邏輯。最后修測(cè)試花的時(shí)間比進(jìn)行業(yè)務(wù)改動(dòng)花的時(shí)間還要長(zhǎng)(甚至長(zhǎng)很多)。 對(duì)代碼進(jìn)行提取抽象之后,為各個(gè)組件或函數(shù)添加測(cè)試,實(shí)際上是用測(cè)試工具的API去重復(fù)業(yè)務(wù)代碼的內(nèi)部實(shí)現(xiàn)邏輯(有時(shí)候還很麻煩!)。任何正常的重構(gòu)都會(huì)導(dǎo)致測(cè)試失敗,你本來(lái)希望測(cè)試能告訴你什么樣的修改是對(duì)的,結(jié)果現(xiàn)在測(cè)試只能告訴你代碼確實(shí)有被修改。 測(cè)試寫(xiě)好,覆蓋率提高,本應(yīng)信心十足地認(rèn)為代碼變得健壯了,可是捫心自問(wèn),你知道自己寫(xiě)的這個(gè)測(cè)試弱點(diǎn)在什么地方,或者說(shuō)還有多少細(xì)節(jié)沒(méi)有涵蓋。你精心模擬了一個(gè)條件,去觸發(fā)邏輯流程,并且測(cè)試通過(guò),可是在真實(shí)的瀏覽器交互中用戶也許并不能觸發(fā)這個(gè)條件。因此,同樣的道理,你在自己的代碼通過(guò)了他人寫(xiě)的測(cè)試之后,也不能確定真實(shí)場(chǎng)景下沒(méi)有問(wèn)題,只好把后續(xù)的重任交給QA。
第一個(gè)問(wèn)題,明明是正確的改動(dòng),可是測(cè)試不止是驗(yàn)證業(yè)務(wù)功能,還對(duì)實(shí)現(xiàn)細(xì)節(jié)提出了不該提出的要求,比如要求你的函數(shù)接受跟以前一樣的參數(shù),返回值必須是字符串而不能是數(shù)組等等。可是這個(gè)函數(shù)只是實(shí)現(xiàn)流程中一個(gè)小小的環(huán)節(jié),也許在下次重構(gòu)時(shí)就會(huì)不復(fù)存在。 第二個(gè)問(wèn)題很類似,如果測(cè)試代碼去重復(fù)實(shí)現(xiàn)細(xì)節(jié),不管進(jìn)行正確還是錯(cuò)誤的重構(gòu),你都得把測(cè)試改一遍,那原先的測(cè)試又能提供什么價(jià)值呢? 第三個(gè)問(wèn)題有時(shí)發(fā)生在,測(cè)試的實(shí)現(xiàn)細(xì)節(jié),不能覆蓋整個(gè)真實(shí)交互流程的時(shí)候。用戶點(diǎn)擊的是屏幕上的button按鈕,而測(cè)試的起點(diǎn)是onClick事件被觸發(fā)。后面的邏輯被驗(yàn)證成功,可問(wèn)題偏偏發(fā)生在點(diǎn)擊環(huán)節(jié),真實(shí)的點(diǎn)擊也許因?yàn)榘粹o狀態(tài)而無(wú)法觸發(fā)onClick事件。
二、沒(méi)有獨(dú)立業(yè)務(wù)含義的測(cè)試單元
插入一段:盡管存在react-hooks-testing-library這樣的工具,但像SWR這樣優(yōu)秀的三方庫(kù),在用testing-library為自己的hook API做測(cè)試的時(shí)候,依然選擇在UI層面進(jìn)行。方法是,把自己的hook置于一個(gè)臨時(shí)的div標(biāo)簽里進(jìn)行render,把數(shù)據(jù)的變化映射成html文字的變化,最后對(duì)文字內(nèi)容做斷言。其實(shí)對(duì)于獨(dú)立性強(qiáng)的函數(shù),個(gè)人覺(jué)得放置在UI里面做測(cè)試倒沒(méi)有太大區(qū)別,但SWR的例子體現(xiàn)了對(duì)“仿照真實(shí)使用場(chǎng)景去測(cè)試”這一原則的尊重。
最后
從真實(shí)用戶的行為流程去測(cè)試,往往比測(cè)函數(shù)本身,能給你帶來(lái)更多的信心。 對(duì)于沒(méi)有獨(dú)立性和通用性的函數(shù)或?qū)ο螅阉鼈円曌鲗?shí)現(xiàn)的一部分,一般沒(méi)有必要為它們?nèi)?xiě)單獨(dú)的測(cè)試。不要拘泥于對(duì)“單元測(cè)試”的字面理解,不要被形式上的規(guī)律所束縛。 不要把測(cè)試覆蓋率視為太過(guò)重要的指標(biāo),它的目的還是幫助提升代碼的穩(wěn)定。有的代碼沒(méi)有覆蓋也沒(méi)關(guān)系,有的代碼值得你覆蓋好多遍。畢竟,我們不是為了寫(xiě)測(cè)試而寫(xiě)測(cè)試。


評(píng)論
圖片
表情

