# 1.了解自动化测试
# 1.1 为什么要有自动化测试
如今大部分互联网团队都是走 敏捷开发 的节奏。实际上,自动化测试才是实现“敏捷”的基本保障。业务端的快速上线和快速验证对技术侧的响应力提出了更高的要求:更快上线,持续上线。再考虑到人员流动和应用逐步变大的事实,日后迭代的成本只会变得越来越高。当然这个项目迭代的成本也跟项目的复杂度有关,比如笔者所在的点餐业务,项目有足够的复杂性,有些细微的改动点其实会牵扯到很多内容,而对刚加入团队的新人就会显得不太友好。因此,项目拥有前端测试是必不可少的,它能够有效保障业务迭代的质量和稳定性。
# 1.2 自动化测试的好处
- 防止低级误操作造成的生产事故
- 提供描述组件行为的文档
- 节省⼿手动测试的时间
- 减少研发新特性时产⽣生的 bug
- 改进设计
- 促进重构
# 2.测试分类
- 单元测试:是指对软件中的最小可测试单元进行检查和验证,通常指的是独立测试单个函数。
- UI 测试:是对图形交互界面的测试。
- 集成测试:就是测试应用中不同模块如何集成,如何一起工作,这和它的名字一致。
- 端到端测试(e2e):是站在用户角度的测试,把我们的程序看成是一个黑盒子,我不懂你内部是怎么实现的,我只负责打开浏览器,把测试内容在页面上输入一遍,看是不是我想要得到的结果。
# 3.常用的前端测试工具
- 单元测试: Mocha, Ava, Karma, Jest, Jasmine 等。
- UI 测试: ReactTestUtils, Test Render, Enzyme, React-Testing-Library, Vue-Test-Utils 等。
- e2e 测试: Nightwatch, Cypress, Phantomjs, Puppeteer 等。
# 3.1 单元测试工具特性对比
# 单元测试
- Mocha 是生态最好,使用最广泛的单测框架,但是他需要较多的配置来实现它的高扩展性。
- Ava 是更轻量高效简单的单测框架,但是自身不够稳定,并发运行文件多的时候会撑爆 CPU.
- Jasmine 是单测框架的“元老”,开箱即用,但是异步测试支持较弱。
- Jest 基于 Jasmine, 做了大量修改并添加了很多特性,同样开箱即用,但异步测试支持良好。
- Karma 能在真实的浏览器中测试,强大适配器,可配置其他单测框架,一般会配合 Mocha 或 Jasmine 等一起使用。
每个框架都有自己的优缺点,没有最好的框架,只有最适合的框架。Augular 的默认测试框架就是 Karma + Jasmine,而 React 的默认测试框架是 Jest.
Jest 被各种 React 和 Vue 应用推荐和使用。它基于 Jasmine,至今已经做了大量修改并添加了很多特性,同样也是开箱即用,支持断言,仿真,快照等。Create React App 新建的项目就会默认配置 Jest,我们基本不用做太多改造,就可以直接使用。Vue CLI 创建项目可选用 Mocha 和 Jest .
# e2e 测试
Puppeteer 是 Google Chrome 团队推出的库,尽管它相对其他 e2e 框架更新,但它同样也有一个庞大的社区。它拥有更简洁易用的 API,更快的运行速度,已逐渐成为业内自动化测试的标杆,俘获大量 Selenium 用户的心。可以看下近年来 e2e 测试框架的 npm trends.
# 4.工具选用及测试目标
# 4.1 工具选用
经过分析,React 项目的技术选型为 Jest + React Testing Library + Puppeteer
而对于 Vue 的项目,为了保持技术栈的统一,我们选用了 Jest + Vue-Test-Utils + Puppeteer
# 4.1 测试目标
- ** 阶段一:项目中使用单元测试(** **Jest + Vue-Test-Utils)****完成对项目主体功能及核心组件的覆盖**
例如:
登录、菜单栏,公共组件等一些核心模块是否能正常使用
这些主体功能测试通过才能自动化部署到线上
- ** 阶段二:增加单元测试覆盖率,使用 e2e(**Puppeteer)**测试部分核心业务模块**
# 5.用例编写与常规操作
# 5.1 编写说明
Vue-CLI@3 生成了 Vue 项目。本身默认都有 Jest 的配置,不需做大的改动。
- 单元测试和 UI 测试的文件夹统一命名为 tests,测试文件以 .test.js 为后缀
- 将 tests 文件夹与它们正在测试的代码放在同级目录下,以便相对路径导入时路径更短
- e2e 测试的文件夹命名为 e2e,并与 src 同放在根目录下
- VScode 和 WebStorm 都有对应的 Jest 插件,安装后书写代码时有代码补全,debug 和自动运行等功能
# 5.2 编写原则
- 测试代码时,只考虑测试,不考虑内部实现
- 数据尽量模拟现实,越靠近现实越好
- 充分考虑数据的边界条件
- 对重点、复杂、核心代码,重点测试
- 利用 AOP(beforeEach、afterEach),减少测试代码数量,避免无用功能
- 测试、功能开发相结合,有利于设计和代码重构
# 5.3 Jest 常用 API
- describe : 定义⼀一个测试套件
- it :定义⼀一个测试⽤用例例
- expect :断⾔言的判断条件
- toBe :断⾔言的⽐比较结果
- jest.useFakeTimers(),jest.runAllTimers(),jest.useRealTimers() 延时函数
**更多 API 详见 **https://jestjs.io/docs/en/api (opens new window)
# 5.4 Vue Test Utils 常用 API
- mount : 挂载组件
- trigger :模拟点击
- contains :可判断某个 dom 是否存在
**更多用法详见 **https://vue-test-utils.vuejs.org/zh/guides/ (opens new window)
# 5.5 生成测试覆盖率报告
只需要在 jest 命令后加入 --coverage 即可
jest --coverage
# # 6.持续集成
# ## 方案一.测试不通过就阻止代码 git 提交
安装 husky:cnpm i husky --save
配置 husky,在 package.json
"husky": {
"hooks": {
"pre-commit": "npm test",
"pre-push": "npm test",
"...": "..."
}
}
当然这是文档的,我们要按我们所需的改成
"husky": {
"hooks": {
"pre-commit": "npm run test:unit"
}
}
代表再提交(commit)前先执行 npm run test:unit
# 方案二.测试不通过就阻止打包发布
先执行 npm run test:unit
再执行 npm run build
npm run test 报错则不会执行 npm run build 命令,从而阻止 jenkins 打包