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