测试驱动开发
TDD 的开发流程(从红到绿)
- 编写测试用例
- 运行测试,测试用例无法通过测试
- 编写代码,使测试用例通过测试
- 优化代码,完成开发
- ‘重复上述步骤
TDD 的优势
- 长期减少回归 BUG
- 代码质量(组织,可维护性)
- 测试覆盖率(尽可能高,但不一定要追求到 100% 覆盖率)
- 错误测试代码不容易出现
行为驱动开发
BDD 的流程(从描述到实现)
- 编写行为描述:使用自然语言编写用户故事或场景,描述系统行为和预期结果。
- 运行测试:用 BDD 框架运行这些场景,初始测试会失败。
- 实现代码:编写实现代码,使测试通过。
- 优化代码:重构代码,确保其符合需求和最佳实践。
- 重复上述步骤:为新的功能或场景继续编写描述、实现代码和优化。
BDD 的优势
- 明确需求:通过自然语言描述,增强对业务需求的理解。
- 提升沟通:开发人员、测试人员和业务人员可以用相同的语言讨论需求。
- 文档化测试:场景描述作为自动化测试和需求文档的双重用途。
- 鼓励用户中心:聚焦于用户需求和行为,提升软件质量和用户体验。
在 Vue 中配置 Jest
在 Vue Cli 中选择启用单元测试,Vue 会帮我们配置好 Jest 的配置。配置完后我们可以执行一下这个命令
1 | npm run test:unit |
这意味着 Vue 帮你配置的单测内容已经执行成功了。紧接着你可以写关于项目的单测内容了。
在 React 中配置 Jest
因为我目前主要的技术栈是 React ,所以 React 的配置 Jest 的篇幅就会也详细些。Vue 中配置 Jest 在掘金上已经有许多好文章了。如果你安装某些依赖报错了别担心,这很有可能因为本地网络环境问题,你可以试着给 npm 配置镜像,如阿里云、腾讯云、清华大学等等的 npm 镜像。亦或者使用 cnpm 。
创建一个 React 项目
1 | $ npm create vite@latest |
用 Vite 创建的项目没有帮我们配置 Jest 的。所以我们要手动安装 Jest 。
1 | npm install --save-dev jest @types/jest @jest/types |
初始化配置
1 | npx jest --init |
- 会涉及到 DOM 的单测,所以要选 JSDOM
- 覆盖率暂时用不上
- 编译代码:Babel 可以将我们写的 ES6 以上的语法特性转换成 ES5,这样我们可以避免一些不必要的兼容性问题。
- 我们希望每次测试完后都清理 mock 等结果。
配置完后可以打开 jest.config.ts
看看
因为选了 Babel 作为单测的编译,还需要增添配置。
1 | npm install --save-dev babel-jest @babel/core @babel/preset-env @babel/preset-react @babel/preset-typescript |
创建 babel.config.js
并添加针对 Babel 的配置。
1 | // ./babel.config.js |
写一个简单的 Jest 例子,用于测试 Jest 是否可以正常运行。
然后执行
1 | npm run test |
因为配置文件用的是 TypeScript 所以要安装 ts-node
依赖。然后要安装 jest-environment-jsdom ,因为 Jest 不会帮我们集成进去。
1 | npm install ts-node --save-dev |
1 | npm install jest-environment-jsdom --save-dev |
因为 Vite 采用了 ESModule 的模块化,所以要将 babel.config 的后缀类型应该使用 cjs。这样 Jest 就能正常运行了。
Jest 的基础配置已经大功告成了。但是还有一些特殊情况,我们需要额外进行一些配置。
而外扩展名识别:据我所知 Jest 不用 Webpack 来构建需要让它知道如何载除 js/jsx 之外的文件扩展名。所以要添加一个转换器。帮助它识别。
1 | "^.+.(js|ts|tsx)$": "./node_modules/babel-jest", |
- Svg mock 转换:项目可能会用到 SVG 等图片,Jest 也是无法识别的,我们需要对它进行 mock,返回相同的输出结果。
1 | "^.+.svg$": "./svg-transform.js", |
1 | // ./svg-transform.js |
- CSS 代理:Jest 本身不知道如何处理不同扩展的文件,我们可以通过配置代理的方式,告诉 Jest 将此对象模拟为导入的 CSS 模块。
1 | npm install --save-dev identity-obj-proxy |
1 | // jest.config.ts |
恭喜做到这些,一个 Jest 的配置就算完了。