講講前端的單元測(cè)試
前言
我希望你看完這篇文章后,能夠?qū)δ愕拈_發(fā)流程有所啟發(fā),那就是我寫這篇文章的初衷了。
什么是單元測(cè)試
顧名思義單元測(cè)試就是測(cè)試最小單元,我們的單元可能是一個(gè)函數(shù),一個(gè)button的樣式,一個(gè)文案等等都可能是一個(gè)單元。那么我們?cè)谧鲂枨蟮臅r(shí)候沒(méi)有必要將所有的單元都做測(cè)試,那可能測(cè)試代碼要比需求代碼多得多呢。我們?cè)谧鲂枨笾靶枰崆跋牒梦覀兊臏y(cè)試用例,并針對(duì)測(cè)試用例編寫測(cè)試代碼,然后寫需求代碼。
為什么做單元測(cè)試
做前端的很多人可能不會(huì)去寫單元測(cè)試,認(rèn)為這是一個(gè)浪費(fèi)時(shí)間的事情,我們有這么多的需求,哪還有時(shí)間跟精力去編寫測(cè)試代碼?這么想當(dāng)然沒(méi)有錯(cuò),但是當(dāng)一個(gè)項(xiàng)目由多人一起維護(hù)的時(shí)候,假如A寫了一個(gè)頁(yè)面,B去維護(hù)A的頁(yè)面加了一些邏輯,C去維護(hù)該頁(yè)面再添加一些邏輯,當(dāng)A再去維護(hù)這個(gè)頁(yè)面的時(shí)候,可能就會(huì)發(fā)現(xiàn)已經(jīng)不是當(dāng)初他認(rèn)識(shí)的代碼了,函數(shù)也不是原來(lái)的語(yǔ)義,大部分的變量不知道干什么用的。那么A需要捋清楚B、C的邏輯,在B、C的基礎(chǔ)上小心翼翼的編寫新的需求,生怕哪一步寫錯(cuò),導(dǎo)致線上的代碼出錯(cuò)。長(zhǎng)此以往下去代碼越來(lái)越難以維護(hù),越來(lái)越少的人能看懂頁(yè)面內(nèi)的邏輯,糊墻試代碼將頁(yè)面堵得水泄不通!當(dāng)然這是最壞的想法,我們不防往好的一方面來(lái)想,假如我們每個(gè)人的編碼水平都很高,都按著規(guī)范去寫代碼,A寫完代碼,B去維護(hù)的時(shí)候?qū)的代碼全部了解之后健壯了新的代碼,C去維護(hù)的時(shí)候再把A、B的代碼全部掌握后再去寫代碼,一個(gè)月,三個(gè)月。。。
所以依賴我們自覺(jué)去維護(hù)代碼首先對(duì)我們個(gè)人能力有很大要求,其次對(duì)我們精力也是恨到的浪費(fèi)。我們要時(shí)刻注意是否自己的代碼影響到別人的代碼。從長(zhǎng)遠(yuǎn)考慮,單元測(cè)試是一個(gè)大型項(xiàng)目的必然選擇。
我們講的單元測(cè)試,只是測(cè)試代碼的最小單元,一個(gè)函數(shù)就是一個(gè)單元,在這里我要提倡大家去學(xué)習(xí)一下函數(shù)式編程。
單元測(cè)試賦予我們的能力
在寫這個(gè)答案之前我需要講一下TDD(測(cè)試驅(qū)動(dòng)開發(fā))。
你問(wèn)我什么是TDD?
TDD是一種思維,測(cè)試來(lái)推動(dòng)整個(gè)開發(fā)的進(jìn)行的思維。你在開發(fā)需求的時(shí)候或許不必寫單元測(cè)試,但是你必須要懂得TDD,才能讓你的代碼看起來(lái)得體。
或許你到現(xiàn)在為止并不清楚什么是TDD,接下來(lái)我用簡(jiǎn)單的語(yǔ)言來(lái)闡述一下。
正如上面的例子中A、B、c遇到的問(wèn)題,我們用TDD的思維來(lái)重新寫這個(gè)頁(yè)面。那么A在拿到需求之后首先應(yīng)該考慮所需要的測(cè)試用例有哪些,然后對(duì)這些測(cè)試用例編寫測(cè)試代碼,接著去編寫業(yè)務(wù)代碼。
什么是TDD
TDD (test-driven development)
- Add a test
在測(cè)試驅(qū)動(dòng)開發(fā)中,每個(gè)新特性都以編寫測(cè)試開始。編寫一個(gè)測(cè)試,它定義了一個(gè)函數(shù)或一個(gè)函數(shù)的改進(jìn),這應(yīng)該是非常簡(jiǎn)潔的。要編寫測(cè)試,開發(fā)人員必須清楚地了解該特性的規(guī)范和要求。開發(fā)人員可以通過(guò)use cases和user stories來(lái)完成這個(gè)任務(wù),以覆蓋需求和異常條件,并且可以在任何適合于軟件環(huán)境的測(cè)試框架中編寫測(cè)試。它可以是現(xiàn)有測(cè)試的修改版本。這是測(cè)試驅(qū)動(dòng)開發(fā)與編寫代碼后編寫單元測(cè)試的一個(gè)區(qū)別特性:它使開發(fā)人員在編寫代碼之前關(guān)注需求,這是一個(gè)微妙但重要的區(qū)別。
2、重構(gòu)
在我們維護(hù)代碼的過(guò)程中,必須定期清理不斷增長(zhǎng)的代碼。新代碼可以從方便的地方轉(zhuǎn)移到它更符合邏輯的地方。重復(fù)的代碼必須被刪除。對(duì)象、類、模塊、變量和方法名應(yīng)該清楚地表示它們當(dāng)前的用途,因?yàn)樘砑恿祟~外的功能,會(huì)導(dǎo)致很難去分辨命名的意義。等到代碼不斷的增加會(huì)使得規(guī)范的命名和刪除重復(fù)代碼越來(lái)越收益。
3、開發(fā)風(fēng)格轉(zhuǎn)換
測(cè)試代碼應(yīng)該在功能代碼之前去寫,這是被認(rèn)為有更多的好處。它能確定這個(gè)程序是為可測(cè)試而寫的,因?yàn)殚_發(fā)者需要從一開始就必須考慮如何編寫測(cè)試程序,而不是后面再去考慮。此外,寫測(cè)試代碼能夠更深的理解需求。