前言
開發中常用的三種測試方式:
- 單元測試
通過提供輸入並確保輸出符合預期,對諸如函式或類等級別的單個單元進行測試。
- 整合測試
測試過程跨多個單元,比如元件API、UI等,確保單元間協同工作符合預期。
- 功能測試
也叫e2e測試,通過編寫測試用例,自動化模擬使用者操作,確保元件間通訊正常。
CyPress簡介:
CyPress是在mocha式API基礎上構建的一套開箱可用的測試框架,對比其他測試框架,它提供一套自己的最佳實踐方案,無需其他測試工具庫,配置方便簡單但功能異常強大,可以使用webpack專案配置,還提供了一個強大的GUI圖形工具。所以作為經常使用JavaScript開發語言的人,會非常容易入門這個自動化測試框架。
在vue-cli3中也對自動化測試做了整合,在vue-cli中有兩種自動化測試框架,其中的一種就是cypress,這也是為什麼我選擇這一款自動化測試框架,針對我們目前專案大部分使用的vue技術棧,也能更好的應用於實際業務當中。
安裝
CyPress可以通過yarn add cypress 或 npm install cypress安裝,也可以在vue-cli中選擇整合,而工程目錄裡也會出現一個cypress的資料夾,用來存放測試用例。下面簡要介紹下cypress下的各個子資料夾的作用:
cypress //cypress目錄
---- fixtures //測試資料配置檔案,可以使用fixture方法讀取
---- integration //測試指令碼檔案
---- plugin //外掛支援
---- support //支援檔案
-cypress.json //cypress全域性配置檔案複製程式碼
執行
按照如上所示安裝好之後,下面就來執行一下來了解這個框架的測試流程。在vue-cli中整合的cypress有已經配置好的命令可執行npm run test:e2e,而在老的專案中我們可以使用node_modules/.bin/cypress open的命令執行。
輸入執行命令之後,我們會看到出現如下的介面。
在這個頁面中我們會看到我們所編寫的測試用例的js檔案,然後可以選擇一個或者選擇Run all specs來執行用例檔案。執行之後會開啟一個新的chrome頁面,這裡我們可以看到用例檔案中的每一條測試語句的執行狀態,並且可以看到他的執行過程和執行結果(綠色表示成功、紅色表示失敗)。
在chrome頁面的右半部會顯示每個節點的快照資訊,並且能夠對比之前和之後的變化差別,可以容易的讓開發者感受到執行某個測試語句前後頁面發生的變化。
語法
在這裡會對CyPress的語法做一個簡要介紹,具體可檢視官方文件。
- 查詢元素
查詢的語法非常近似於jQuery的元素選擇器,例如:JQ->$('.my-selector')、CY->cy.get('.my-selector')
- 文字內容查詢
匹配內容是否符合預期使用 cy.get('XX').contains('inner'),inner為預期的內容值
- 文字輸入
當需要在輸入框輸入值時使用type關鍵字
- 斷言語句
需要判斷元素的內容、value、類名等資訊可使用should('have.attributs',value)
- 命令可以是promise的形式
cy.get('button').then(($btn)=>{})
- 元素互動
多種動作命令:blur、focus、clear、check、select等
- 超時機制
可根據不同的需求修改超時時長(大多數命令超時預設為4秒)
- 條件測試
可以使用if else進行條件判斷
- 鉤子函式
CyPress提供了一些鉤子函式before、beforeEach、after、afterEach
對於鉤子函式的功能介紹:
- before(()=>{//在全部案例執行之前執行一次})
- after(()=>{//在全部案例執行之後執行一次})
- beforeEach(()=>{//在每一條案例之前執行})
- afterEach(()=>{//在每一條案例之後執行})
自動化測試流程圖
CyPress的優勢
- 上手快、文件詳細,官網帶有視訊教程(非常適合新手)
- 使用js語法對前端開發者友好
- 執行速度,優勢在於編輯儲存指令碼後執行速度會優於selenium,能夠保證快速驗證介面功能
- 強大的快照功能,可以顯示在某一條測試語句前後的頁面比對
- 工具提供控制元件定位:1.點選選擇器->2.點選定位元素->3.複製生成程式碼
- 提供多種元素互動api,例如:blur、focus、clear、select、dbclick
- 自帶GUI工具,可以看到整個測試過程,也可錄屏
與其他框架的差別
大多數測試工具(如Selenium)通過在瀏覽器外部執行並在網路上執行遠端命令來執行。Cypress恰恰相反,Cypress在與你的應用程式相同的生命週期裡執行。
Cypress背後是Node服務程式。Cypress和Node程式不斷進行通訊,同步和執行任務。訪問這兩個部分(前端和後端)使我們能夠實時響應你的web應用程式的事件,與此同時也能完成需要更高許可權的任務。
一些思考
- 為什麼要做端到端的測試?
在負責的系統中會有一些比較穩定的模組(不經常改動),在有些時候改了其他模組的一小塊可能會影響到穩定的模組,而這時就需要對這個模組做迴歸測試以保不受影響可以穩定使用,如果每一次都需要開發人員對其進行迴歸是耗時耗力的,而這時就需要了我們為這個模組編寫的e2e測試用例,只需要執行一下這個測試用例就可以看到模組的各項功能是否能夠完整執行。
- 對於編寫的測試用例要加以註釋或有文件:
測試用例是一個可以上傳到倉庫的檔案,所以為了方便別人維護測試用例或者是瞭解你的測試流程,請務必要寫上測試流程的註釋,或者建立一個專門用於統計測試用例的文件來記錄有哪些測試用例和用例的內容,這樣能夠很好的保證用例的完整性、可讀性和可維護性。
- 關於測試覆蓋率:
目前cypress沒有內建測試覆蓋率的統計功能,目前可以使用Chrome自帶的來檢視。在GUI開啟的測試瀏覽器中開啟devtools,切換到Sources,按下cmd+shift+p(或ctrl+shift+p),輸入coverage,選擇重新重新整理並統計程式碼執行覆蓋率。