只有了解了設(shè)計(jì)它的初衷第步,才能更好的理解它的應(yīng)用并更加主動(dòng)地去學(xué)習(xí)并克服它的難點(diǎn)粘都。
(下面主要是從前端的角度描述的)
那么翩隧,單元測(cè)試的設(shè)計(jì)初衷是什么呢呻纹?也就是為什么要有單元測(cè)試?
根本的原因是用來(lái)確定設(shè)計(jì)的接口或API是否合適使用淑仆,是否和預(yù)想的一樣。
每個(gè)單元測(cè)試就是一段測(cè)試一個(gè)模塊或接口是否能達(dá)到預(yù)期結(jié)果的代碼嘁圈。
開(kāi)發(fā)人員需要單元測(cè)試來(lái)模擬使用者最住,并快速檢驗(yàn)代碼是否健壯涨缚。
通過(guò)單元測(cè)試可以更高效更穩(wěn)定的確認(rèn)代碼是否符合需求以及代碼是否健壯策治。
那實(shí)際開(kāi)發(fā)環(huán)境中也可以測(cè)試通惫,為什么還麻煩寫(xiě)單元測(cè)試呢?
因?yàn)榇蟛糠珠_(kāi)發(fā)人員覺(jué)得寫(xiě)測(cè)試代碼很“浪費(fèi)”時(shí)間珊燎,而且還需要后期的維護(hù)遵湖。如果沒(méi)從根本上認(rèn)識(shí)它的好處,往往是開(kāi)頭容易谋国,堅(jiān)持難(這一點(diǎn)生活中好多都是這樣迁沫,跑步集畅,減肥等)。
那么單元測(cè)試到底有哪些好處呢藐吮?
先看實(shí)際開(kāi)發(fā)環(huán)境做不到或做不好的方面開(kāi)始:
耦合性強(qiáng)
因?yàn)閷?shí)際開(kāi)發(fā)環(huán)境會(huì)依賴一大堆的條件,測(cè)試一次需要從一個(gè)頁(yè)面跳到另一個(gè)頁(yè)面(或幾個(gè))迫摔,而且耦合性很強(qiáng)句占,前面一個(gè)頁(yè)面沒(méi)有完成纱烘,后面的頁(yè)面沒(méi)辦法測(cè)試。
一次只能測(cè)試一條case
因?yàn)槊看沃荒苓\(yùn)行一個(gè)流程擂啥,所以只能測(cè)試一條case哺壶,多個(gè)出錯(cuò)的條件以及多個(gè)分支必須跑多次才能測(cè)試到山宾。
代碼質(zhì)量無(wú)法保證
一個(gè)team多人開(kāi)發(fā)的時(shí)候,你無(wú)法保證整個(gè)team的代碼質(zhì)量资锰,也沒(méi)有判斷的標(biāo)準(zhǔn)绷杜。試想接剩,當(dāng)領(lǐng)導(dǎo)問(wèn)你說(shuō)萨咳,“這個(gè)project的代碼質(zhì)量怎么樣培他?”遗座,你只能傻眼途蒋。如果你說(shuō)好還是不好,領(lǐng)導(dǎo)都覺(jué)得你在說(shuō)空話(其實(shí)你自己往往很糾結(jié),說(shuō)好吧梯醒,出bug了茸习,領(lǐng)導(dǎo)會(huì)說(shuō)壁肋,你看某某某就能說(shuō)空話;說(shuō)不好吧猫胁,那公司養(yǎng)你有什么用弃秆。)察净。
其實(shí)領(lǐng)導(dǎo)想聽(tīng)到的是數(shù)據(jù)而不是你的猜想,因?yàn)樯钍蔷唧w的锈至,需要用數(shù)據(jù)來(lái)說(shuō)話的峡捡!
任務(wù)分工困難
如果一個(gè)功能測(cè)試需要依賴其他人的功能筑悴,那么對(duì)于一個(gè)team的任務(wù)分工太難了。
單元測(cè)試可以解決上面的問(wèn)題嗎砚婆?
回答是肯定的突勇!
除了上面都可以解決,而且還有額外的好處埂奈,下面看看還有哪些額外的好處账磺?
提高代碼質(zhì)量
因?yàn)橐獙?xiě)每個(gè)分支的測(cè)試用例,所以寫(xiě)出的代碼接口更抽象氏捞,考慮到的case更多幌衣。即使是命名壤玫,也會(huì)比平時(shí)多加思考,而不是簡(jiǎn)單的隨意取名楚里,后面覺(jué)得不合適班缎,再去修改达址。
大膽得去重構(gòu)
重構(gòu)代碼會(huì)經(jīng)常做趁耗,但是大部分人會(huì)遇到苛败,如果明天要發(fā)布版本了罢屈,今天該做的重構(gòu)可能就不會(huì)做了缠捌,怕影響發(fā)布。但是如果有單元測(cè)試肃叶,你完全可以按照計(jì)劃大膽的去做十嘿。這樣代碼質(zhì)量可以時(shí)刻保證绩衷。
如何確定一個(gè)API是否合適使用
根據(jù)單元測(cè)試的每一種case
判斷它的覆蓋面
判斷它的健壯性
判斷它的代碼質(zhì)量
判斷它是否達(dá)到更高的抽象
使用者往往不需要看代碼的實(shí)現(xiàn)咳燕,單元測(cè)試可以完整表達(dá)它所具備的功能(如果不可以,說(shuō)明覆蓋面差)
而且現(xiàn)在的測(cè)試框架尤其是BDD低缩,行為驅(qū)動(dòng)測(cè)試咆繁,測(cè)試的case看起來(lái)就像讀一段文字似的玩般,這樣別人通過(guò)看你的測(cè)試case就大概能了解你的接口的功能是什么礼饱。
如何去做Javascript單元測(cè)試
現(xiàn)在有很多測(cè)試的框架镊绪,如Jasmine蝴韭。
現(xiàn)在有很多的自動(dòng)化測(cè)試工具万皿,如Karma牢硅。
對(duì)于前端,除了單元測(cè)試還有頁(yè)面的交互測(cè)試工具综苔,如Selenium
光有測(cè)試還不行如筛,需要有覆蓋率杨刨,這個(gè)也有工具妖胀,如Istanbul
測(cè)試場(chǎng)景設(shè)想
前面描述了這么多好處赚抡,又有這么多的測(cè)試工具爬坑,真的有這么多好處嗎?
下面是一個(gè)項(xiàng)目測(cè)試場(chǎng)景的設(shè)想或設(shè)計(jì):
為新工程搭建測(cè)試環(huán)境
一個(gè)新的工程涂臣,搭建測(cè)試框架盾计,搭建自動(dòng)化測(cè)試工具,搭建覆蓋率檢測(cè)工具赁遗,為代碼編寫(xiě)單元測(cè)試署辉。
git server運(yùn)行自動(dòng)化測(cè)試工具
在一個(gè)git server機(jī)器,運(yùn)行自動(dòng)化測(cè)試工具吼和,一直在檢測(cè)如master分支的變化涨薪。
代碼測(cè)試覆蓋率范圍設(shè)定
覆蓋率可以設(shè)置覆蓋的范圍,如90%表示通過(guò)(當(dāng)然100%最好炫乓,但是做到完美不容易,暫且使用90%)辨萍,<90%表示不通過(guò)邦邦。
自動(dòng)檢測(cè)
當(dāng)team中的member提交代碼到此git分支下鬼店,自動(dòng)化工具會(huì)自動(dòng)編譯并運(yùn)行巍棱,同時(shí)給出一個(gè)報(bào)告說(shuō)明是否所有的測(cè)試用例都通過(guò)了。
還會(huì)給出覆蓋率的報(bào)告生成倒得,如果達(dá)到了之前設(shè)定的覆蓋率的范圍讹躯,就說(shuō)明通過(guò),否則就是不通過(guò)。
員工能力的提高
如有的員工經(jīng)常提交代碼都會(huì)出現(xiàn)測(cè)試用例不通過(guò),或者是覆蓋率沒(méi)達(dá)標(biāo),幾次下來(lái),老板不說(shuō),自己也會(huì)補(bǔ)血了熔恢。
員工和領(lǐng)導(dǎo)的信任度提高
作為員工耗啦,是不是現(xiàn)在就不會(huì)出現(xiàn)上面說(shuō)到的領(lǐng)導(dǎo)問(wèn)你代碼質(zhì)量時(shí)的尷尬和糾結(jié),而是拍拍胸脯說(shuō)“質(zhì)量過(guò)關(guān)”获黔。
作為領(lǐng)導(dǎo),你看到這樣的代碼質(zhì)量,是不是會(huì)更放心的把任務(wù)交給自己的員工,也會(huì)對(duì)項(xiàng)目有更好的把握。
你是否感覺(jué)代碼的單元測(cè)試就像人類的免疫系統(tǒng)呢?
如果是忘古,那么接下來(lái)讓我們一起給我們的代碼建立一套免疫系統(tǒng)吧干旁!
(完)