jest-vue前端自動化測試實踐01—概念&環境搭建

  • 2019 年 11 月 1 日
  • 筆記

jest-vue前端自動化測試實踐01—概念&環境搭建

toc

Write By CS逍遙劍仙 我的主頁: www.csxiaoyao.com GitHub: github.com/csxiaoyaojianxian Email: [email protected]本節程式碼地址 https://github.com/csxiaoyaojianxian/JavaScriptStudy 下的自動化測試目錄

1. 概念

1.1 前端自動化測試的意義

在日常的開發中,前端錯綜複雜的變化引發的bug往往令開發者頭疼,或多或少經歷過 修完東牆西牆倒 的經歷,此時前端自動化測試就顯得非常重要。前端的自動化測試無非也是編寫測試用例,在開發過程中和版本打包發布時執行跑通全部測試用例。如果是一個短平快的小項目,引入前端自動化測試,編寫測試用例,無疑只會增加開發成本,然而當項目擴大、迭代頻繁、邏輯複雜、需求反覆變更的情況下,回歸測試的成本是巨額的,自動化測試的優勢就能體現出來。

自動化測試的收益 = 迭代次數 * 全手動執行成本 - 首次自動化成本 - 維護次數 * 維護成本

儘早引入前端自動化測試不僅能夠減少項目 bug 出現概率(尤其是回歸測試中的 bug),還能更好地進行程式碼組織,增強項目的可維護性,尤其對於工程品質較差的項目,收益是巨大的。

1.2 分類

前端自動化測試分兩類:TDD (Test-Driven Development) 測試驅動開發BDD (Behavior Driven Development) 行為驅動開發。TDD 顧名思義,開發者根據需求先編寫測試用例,再逐步開發,最終滿足全部測試用例的需求。剛開始的時候,只有測試用例,未進行功能開發,執行測試用例,滿屏是紅色的測試用例不通過提示,隨著測試用例被滿足變綠,最終全部變綠,功能開發完成,因此前端自動化測試也被叫做 Red-Green Development

1.2.1 TDD (Test-Driven Development) 測試驅動開發

  1. TDD 先寫測試再寫程式碼,單位是模組,多用於 單元測試
  2. 重點在測試程式碼,屬於 白盒測試
  3. 測試內容是模組,速度快,但是忽略模組間依賴,安全感低

TDD 有以下優勢:

  1. 長期減少回歸BUG
  2. 程式碼品質會更好(組織、可維護性)
  3. 測試覆蓋率高

1.2.2 BDD (Behavior Driven Development) 行為驅動開發

  1. BDD 先寫程式碼再寫測試,測試單位是功能,多用於 集成測試
  2. 重點在測試 UI(DOM)功能,屬於 黑盒測試
  3. 測試內容是整套操作流程,速度慢,往往需要多個模組配合,安全感高

1.3 工具選擇

前端近幾年湧現出很多優秀的測試工具:

  • karma – Google Angular團隊開發的測試運行平台,配置簡單靈活,能夠很方便在多個真實瀏覽器中運行測試
  • mocha – 很優秀的測試框架,有完善的生態系統,簡單的測試組織方式,不對斷言庫和工具做任何限制,非常靈活
  • jest – facebook出品的大而全的測試框架,React官方推薦的單元測試框架,配置簡單運行速度快

還有很多其他的前端測試框架,但大同小異,無非是對斷言和測試樁等工具的集成度不同,論成熟度首推 mocha,論效率首推 jest。

jest是 Facebook 開源的 JavaScript 測試框架,它自動集成了斷言、JsDom、覆蓋率報告等開發者所需要的所有測試工具,是一款幾乎零配置的測試框架,而且速度很快,此處選擇 jest 作為測試工具。

2. jest 環境搭建

2.1 jest 安裝

jest 需要自動運行測試腳本,node 環境是必不可少的,如果從頭搭建,首先得初始化項目 package.json 並安裝 jest:

$ npm init  $ npm install jest -D

jest 默認不支援 es6,需要使用 babel 來支援 es6,安裝 babel:

$ npm install @babel/core @babel/preset-env -D

配置 babel,修改 .babelrc 文件

{      "presets": [          ["@babel/preset-env", {              "targets": {                  "node": "current"              }          }]      ]  }

2.2 jest 初始化

安裝完 jest 以後,初始化 jest 並根據需要修改根目錄下生成的配置文件 jest.config.js

$ npx jest --init

修改 package.json 中的 scripts,添加執行指令

(1) 普通執行測試,即 $ npx jest

{  	"test": "jest"  }

(2) 生成覆蓋率報告,即 $ npx jest —coverage

{  	"coverage": "jest --coverage"  }

(3) 持續監聽變化,默認 o 模式

{  	"test": "jest --watch"  }

(4) 持續監聽所有文件變化

{  	"test": "jest --watchAll"  }

2.3 編寫測試用例

先寫一個功能模組 init.js

function add (a, b) { return a + b; }  function minus (a, b) { return a - b; }  function multi (a, b) { return a * b; }  module.exports = { add, minus, multi }

編寫對應測試用例文件 init.test.js

const math = require('./init.js');  const {add, minus, multi} = math;  // 斷言  test('測試加法 3 + 7', () => { expect(add(3, 7)).toBe(10); })  test('測試減法 3 - 3', () => { expect(minus(3, 3)).toBe(0); })  test('測試乘法 3 * 3', () => { expect(multi(3, 3)).toBe(9); })

執行測試,並在控制台觀察結果

$ npm run test  $ npm run coverage

3. vue-cli 中使用 jest

現實項目中,往往不會從零搭建 jest 項目,更多的情況是,需要在一個腳手架已經搭建好的項目中引入自動化測試,此處在 vue-cli 基礎上修改 jest 配置,安裝好 jest 後需要修改項目根目錄下的配置文件 jest.config.js,重點關注 testMatchtestPathIgnorePatterns 兩個屬性,testMatch 指定了匹配的測試用例文件的路徑,而 testPathIgnorePatterns 則可以忽略指定文件,因此使用兩個屬性可以精確匹配到項目中所有的測試用例。

module.exports = {    ...    testMatch: [      '**/__tests__/**/*.(js|jsx|ts|tsx)'    ],    testPathIgnorePatterns: [      '.eslintrc.js'    ],    testURL: 'http://localhost/'  }

最後還需要在 package.json 中添加測試指令

{  	"test:unit": "vue-cli-service test:unit --watch"  }

執行對應指令即可在項目中執行測試

$ npm run test:unit
sign.jpg