【前端资料】如何做好组件库的测试

通用组件库能够得到认可,测试是非常必要,测试覆盖率达到多少是衡量组件库质量的一个重要指标。

关于前端的测试在vue官方文档上也有[说明], 以下为总结的一些重点:

自动化测试分类

单元测试

单元测试:是指对软件中的最小可测试单元进行检查和验证。简单来说,单元就是人为规定的最小的被测功能模块,可能是一个单一函数或方法、一个完整的组件或类。

单元测试是最小巧也是最简单的测试——它们通过隔离单个组件的每一个部分,来在最小工作单元上进行断言。

单元测试侧重:检验函数的输出结果

E2E测试

e2e (端到端) 测试,致力于确保组件的一系列交互是正确的。它们是更高级别的测试,例如可能会测试用户是否注册、登录以及更新他们的用户名。这种测试运行起来会比单元测试和快照比对测试慢一些。

e2e测试侧重:从用户视角,对真实系统的访问行为进行仿真

快照比对测试

快照比对测试(snapshot testing)会保存你的 Vue 组件的标记,然后比较每次新生成的测试运行结果。如果有些东西改变了,开发者就会得到通知,并决定这个改变是刻意为之 (组件更新时) 还是意外发生的 (组件行为不正确)。

自动化测试框架

类型 备注
vitest 单元测试框架 可继续vite配置;支持Vue、React、Lit 等框架;测试用例支持HMR,运行速度快 (jest需要通过快捷键P,过滤后来运行指定测试文件);开箱即用的 TypeScript / JSX 支持;ESM first, top level await;多线程支持(tinypool);jest 友好;通过 c8 输出测试用例覆盖;配置简单;日志信息很清爽
Jest 测试框架 Jest由Facebook开发,用于测试JavaScript代码(尤其是使用React JS开发的应用程序);集成了断言、JSDom、覆盖率报告等,是一款几乎零配置的测试框架;提供snapshot功能
Mocha 测试框架 基于JavaScript的自动化测试框架,用于测试使用Node.js运行的应用程序比较年老的测试框架,在JavaScript界使用更广泛,可参考文献更多
Jasmine 测试框架 主要用于异步测试,是一个功能丰富的JavaScript自动化测试框架,Jasmine需要很多配置
sinon 测试框架 用于 JavaScript 的测试监视(spy)、桩(stub)和仿制(mock)功能。不依赖其他类库,兼容任何单元测试框架
chai 断言库 一套TDD(测试驱动开发)/BDD(行为驱动开发)的断言库expect/should库
Karma 运行器 不是测试框架,也不是断言库,是允许你的JavaScript代码在复杂的浏览器运行的工具(抹平浏览器障碍)
Vue-test-utils 单元测试工具库 vue官方提供的,专门为测试单文件组件而开发

表 1自动化测试框架

基础测试知识

jest

  1. jest文件和目录命名规范
    待测试文件: hello.js 测试脚本文件取名:hello.test.js orhello.spec.js 测试目录:tests or__tests__

  2. 测试函数

test("测试用列描述信息",()=>{

})
// or
it("测试用例描述信息",()=>{

})
  1. 断言函数
    测试即运行结果是否与我们预期结果一致 断言函数用来验证结果是否正确
exspect(运行结果).toBe(期望的结果);
//常见断言方法
expect({a:1}).toBe({a:1})//判断两个对象是否相等
expect(1).not.toBe(2)//判断不等
expect({ a: 1, foo: { b: 2 } }).toEqual({ a: 1, foo: { b: 2 } })
expect(n).toBeNull(); //判断是否为null
expect(n).toBeUndefined(); //判断是否为undefined
expect(n).toBeDefined(); //判断结果与toBeUndefined相反
expect(n).toBeTruthy(); //判断结果为true
expect(n).toBeFalsy(); //判断结果为false
expect(value).toBeGreaterThan(3); //大于3
expect(value).toBeGreaterThanOrEqual(3.5); //大于等于3.5
expect(value).toBeLessThan(5); //小于5
expect(value).toBeLessThanOrEqual(4.5); //小于等于4.5
expect(value).toBeCloseTo(0.3); // 浮点数判断相等
expect('Christoph').toMatch(/stop/); //正则表达式判断
expect(['one','two']).toContain('one'); //不解释
  1. 分组函数
describe("关于每个功能或某个组件的单元测试",()=>{
    // 不同用例的单元测试
})
  1. 常见命令
{
  "nocache": "jest --no-cache", //清除缓存
  "watch": "jest --watchAll", //实时监听
  "coverage": "jest --coverage",  //生成覆盖测试文档
  "verbose": "npx jest --verbose" //显示测试描述
}

更多参考
选择框架标准

与vue生态系统的最佳兼容性

一流的错误报告

两大组件库测试方案

Karma + MOCHA + CHAI + Sinon + Istanbul

图 1Karma +Mocha测试技术体系

测试流程

图 2Karma测试的流程

warning:Karma、Mocha、char三剑客在测试ts写的vue组件出不了测试覆盖率

Vue-test-utils +jest

vue-test-utils在Vue和Jest之间提供了一个桥梁,暴露出一些接口,让我们更加方便地通过Jest为Vue应用编写单元测试

一站式的测试方案
DOM API

断言库

Mock库

快照

覆盖率

测试内容

测试键盘、鼠标等其它 DOM 事件

测试异步行为

来自VUE的更新

来自外部行为的更新

测试vuex

参考 vue-test-utils

前端单元测试实践策略(根据后续实践会进行调整)

代码类型 测试策略 重要程度
utils通用方法 没有外部依赖的纯函数要求100%覆盖 :star::star::star::star::star:
纯UI公共组件 通过快照方式测试,覆盖范围广,2~3个快照测试用例 :star::star:
具有业务逻辑的组件 使用vue-test-utils :star::star::star::star:

测试用例

KuiButton.vue

KuiButton.spec.js

测试结果:

测试报告

备注:

TDD 测试模式: 测试驱动开发(就是我们先根据需求去写测试用例,根据测试用例再去写我们的功能。当我们增加或者修改某一项需求的时候,首先修改的是测试用例,根据测试用例再去修改代码逻辑)

BDD 测试模式:行为驱动开发(根据用户的行为进行开发,等到改功能开发完毕,再进行测试代码的编写)
KOCA-UI组件库测试方案预研.docx (521.6 KB)