Better

Ethan的博客,欢迎访问交流

前端测试类型与选型

前端测试的类型细分众多,测试技术选型更是五花八门,甚至容易弄混,下面来简单了解一下吧

测试分类

前端测试大致可以如下几类

  • 静态测试: 在编写代码逻辑阶段时进行报错提示。(代表库: eslint、TypeScript)
  • 单元测试:对软件中最小可测试单元进行检查和验证,通常指的是独立测试单个函数,职责是对一些边界情况或者特定的算法进行测试
  • UI 测试:对图形交互界面的测试
  • 端到端测试:站在用户的角度,把程序看成黑盒,只负责打开浏览器,把测试内容在页面上输入一遍,看是不是我想要的结构

技术选型

技术选型五花八门,为方便了解到最合适的方案,直接使用 vue-cli 和 cra 看看 Vue 和 React 脚手架的技术选型是什么

  • vue-cli:jest + @vue/test-utils + cypress
  • cra:jest + @testing-library/react
  • umi:jest + enzyme + puppeteer

从上可以看出 cra 并没有提到端到端测试,但 umi(阿里一个团队推出的)中使用 puppeteer,且该团队使用的 UI 测试框架是 enzyme,但作者自己也说 @testing-library/react 将成为主流,enzyme 淡出,因此这里我们只简单了解一下 enzyme 和 @testing-library/react 的区别,驻点学习后者。

值得一提的是 jest 基于 Jasmine,做了大量修改并添加了很多特性。

enzyme vs @testing-library/react

  • enzyme 出来更早,但常常滞后于 React 功能的实现,后者出现比较晚,倾向与支持 React 新特性
  • enzyme 从代码实现的角度出现进行测试,基于 props 和 state
  • React Testing Library 从用户体验的角度出发,基于 dom 进行测试,拥有更好的开发体验和更稳定的测试

enzyme 安装依赖

npm install --save-dev enzyme enzyme-adapter-16

react-testing-library 依赖安装

npm install --save-dev @testing-library/jest-dom @testing-library/react

再来看看 Puppeteer, 是 Google Chrome 团队推出的库,尽管它相对其他 e2e 框架更新,但它同样也有一个庞大的社区。它拥有更简洁易用的 API,更快的运行速度,已逐渐成为业内自动化测试的标杆,俘获大量 Selenium 用户的心。

因此针对 React 项目开发,推荐技术选型为:Jest + React Testing Library + Puppeteer

原则与优先级

编写原则

  • 对测试代码,只考虑测试,不考虑实现
  • 数据尽量模拟现实,越接近现实越好
  • 充分考虑数据的边界条件
  • 对重点、复杂核心代码,重点测试
  • 利用 AOP(beforeEach,afterEach),减少测试代码数量

对于单元测试来说,是成本低且收益高,而对 UI 测试来说,可能更像是成本高但收益低。但是对于一些公共组件的测试还是很有必要的,当项目的代码足够复杂时,一个通用组件的改动迎接你的可能就是一个线上 Case。

对于 e2e 测试而言,通常我们不需要写太多,毕竟我们有专业的 QA 同学,大致覆盖一些简单的主流程即可。

只有单元测试和 UI 测试会计算到测试覆盖率,而 e2e 不会被计算进去。e2e 不需要写太多,因为大部分关键逻辑已经被单元测试覆盖,e2e 只需要简单的进行主流程的模拟。

同时由于目前项目大多属于敏捷开发,UI 样式的改动或者功能性需求较多,时间上也无法允许我们做到更好的测试覆盖。因此大概优先级

  1. 通用组件、工具类函数
  2. 业务逻辑
  3. 业务组件
  4. e2e 测试

编写测试简单规则,又叫做 AAA 模式

  1. 编排(Arrange):初始化代码,为接下来步骤做准备
    1. 渲染组件:render
    2. 获取所需 DOM 的不同元素,getXXX
  2. 执行(Act):执行用户应该执行的步骤,比如点击
    • fireEvent
  3. 断言(Assert):对应该发生的事情进行断言
    • expect

聚焦和忽略用例:使用 xit() 取代 it() 可以暂时忽略用例,fit() 可以聚焦当前用例并忽略其他所有用例。这两个方法可以帮助你在开发过程中只关注当前需要的用例。

具体使用

简单使用可以直接参考:CRA Running Tests

里面有典型例子可以参考: 用Jest来给React完成一次妙不可言的~单元测试



留言