作為乙個前端,一開始並不知道單元測試的好處,覺得費時費力,效果也不明顯,直到有個模組因為效能問題進行了一次重構,被折磨得筋疲力盡的時候,才發現單元測試的好處,可以說,有了單元測試,才能面對其他同事寫的或者n年以前的**,放心大膽的對其進行持續的維護甚至重構。單元測試的核心就是斷言,通過斷言來判斷**是否達到目的
node內建斷言assert,以下圖為最簡單例子,如果錯誤會丟擲異常
chai
這個斷言庫很全很強大,提供了常用的assert should expect斷言關鍵字
各類的用法就不提了,方法比較簡單,一查便知。 assert最簡單,不過目前expect用得比較多,例如expert(***).tobe(***x)
但是
egg官網推薦assert,理由是簡單,不用記一些複雜api。
mocha是老牌的庫,簡單全面易用,目前公司就在用mocha+chai測試前端資料邏輯,用來測試node,util裡面的函式都可以,測試元件需要搭配其他框架。
mocha測試的鉤子 mocha在describe塊之中,提供測試用例的四個鉤子:before()、after()、beforeeach()和aftereach()。 可以用before鉤子提前把測試環境和資料準備好,beforeeach鉤子可以在每個測試用例前準備乙個或多個新的物件,防止被前面的用例汙染
describe('測試index.js',()=> )
})})複製**
最後,mocha預設每個測試用例最多執行2000毫秒,如果到時沒有得到結果,就報錯, 而且mocha缺省會高亮顯示超過75毫秒的測試用例,可修改
sinon具有非常有特色的spies, stub, mock三個功能,有興趣的可以嘗試手寫實現。
spies => 間諜函式,間諜函式是sinon最簡單的部分,其它的功能都是建立在spies之上的,spies的主要用途是收集有關函式呼叫的資訊,例如是否呼叫了函式等。spies的實現監聽的基礎上是不會影響函式本身正常呼叫(被監聽的函式的上下文關係不會被影響)。
stub完全取代了這個函式,而且擁有spies的所有功能。當使用stub時,函式將不具有原始的功能,而是替換後的函式。
mock與stub的功能一樣都是用來替換指定的函式,如果你想替換掉乙個物件中的多個方法,這時mock就可以發揮作用了,但是如果僅僅是替換物件中的乙個函式,那麼stub更加簡單易用,當我們使用mock的時候應該十分小心,因為大量的替換原有**邏輯,會導致test變的脆弱。
用來模擬傳送網路請求,需要替代後台介面時使用。
非jsdom,提供真實瀏覽器環境,由於目前各類框架已經比較完善了,現在已經基本被排除在主流框架之外
顧名思義,用於模擬 redux 中的 store。由於工作中一直用mobx,這裡不多做介紹了
使用與jest類似,以前通常和karma配合,大而全的測試框架(jest)成為主流後,用的少了
jest 是facebook推出的一款測試框架,整合了mocha,chai,jsdom,sinon等功能。所以剛入門的同學如果想應用直接可以上jest。
react官方腳手架自帶jest,vue-cli3.0中也整合了單元測試框架,選擇的時候會問你選mocha+chai還是jest。
"jest":
複製**
jest --coverage
複製**
airbnb公司推出的 enzyme ,專門用來測試react元件,相對應vue中也有test-utils包,基本是一樣的功能,也是對元件掛載後進行事件觸發、元素存在等判斷。
這裡以enzyme為例講解,enzyme主要提供三種渲染方式:render、mount、shallow,存在以下區別:
render渲染結果是普通的html結構,shallow和mount對元件的渲染結果是react樹,如果你用過chrome的react devtool外掛程式,他的渲染結果就是react devtool tab下檢視的元件結構。
shallow只渲染當前元件,只對當前元件做斷言,不會產生子元件;mount會渲染當前元件以及所有子元件,對所有子元件也可以做上述操作。一般互動測試都會關心到子元件,我使用的都是mount。但是mount耗時更長,記憶體啥的也都占用的更多,如果沒必要操作和斷言子元件,一般使用shallow。
單元測試屬於需要投入,但是看不見產出的工作,所以直接選擇最簡潔的框架,節約時間,才是提公升kpi的關鍵,現在的框架越來越趨向簡單和人性化,所以如果工作中使用,直接選jest類整合框架就好。
我在的tob傳統軟體服務公司,前端的穩定性更加重要,在乙個產品快速迭代期後,單元測試也會逐步進行覆蓋util模組和model層(響應action的資料變化處理),其它則需要看迭代排期,經常重構的基礎公共元件也會排上。每個公司需求不同,如果是上線就撤的專案,可以不用部署測試。所以大家考慮引進單元測試前,請靈活考慮成本和收益。
前端單元測試框架jest總結
1 jest 環境搭建 檢視是否安裝成功 cmd進入 front end testing demo example目錄下輸入命令 npm install安裝所需要的依賴包 只有第一次需要安裝依賴包 安裝完成後,輸入npm test執行用例 選擇a執行所有的用例 輸入p是選擇執行哪個檔案的用例 2 j...
簡單介紹unittest單元測試框架
我們舉例來,練習一下test fixture和test case的使用,學習unittest的簡單用法 新建乙個testbaidu.py的檔案 匯入unittest模組 當前測試類繼承unittest.testcase,相當於當前利用unittest建立了乙個test case,這個test cas...
前端測試 Part II (單元測試)
原文 testing your frontend code part ii unit testing by gil tayar 我們在part1裡已經說過,但與那測試就是測試單元的 不管這些單元是函式 模組還是類。多數人認為測試應該以單測為主,但我不這麼認為,如果你同意也沒有問題。我會一遍一遍又一遍...