• 单元测试(jest):理解、安装、使用


    一、理解单元测试的重要性

    bug发现在开发阶段,成本很低,
    如果发现在生产环境,成本很高,
    如果是关键时刻,决定人生命运,决定企业发展。

    从技术的角度讲,有效的提高代码的健壮性,有效的增加代码的可维护性,对于后期的代码重构是必要条件。

    从团队的角度讲,开发人员的代码经过完整的单元测试,可以有效的减少测试成本,维护成本,运维成本,运营成本。

    不要存在bug不会被发现的侥幸心理,我的经验,bug不是在开发阶段发现就是在测试阶段发现,不是在测试阶段发现就是在生产环境被用户发现。终究会暴露,越早越好。

    写了单元测试,我们可以有信心(有依据)的告诉用户我的程序是多么的健壮。
    写了单元测试,我们可以有效的培养自己做人、做事的高度。
    写了单元测试,是我们工匠精神的体现。

    二、jest与项目环境介绍

    2.1、Jest:Facebook 的一套开源的 JavaScript 测试框架, 它自动集成了断言、JSDom、覆盖率报告等开发者所需要的所有测试工具,是一款几乎零配置的测试框架。

    2.2、环境:vue3 + ts + vite2 + pinia + jest + pnpm

    三、jest单元测试实践

    3.1、安装

    pnpm add babel-jest@latest jest@latest ts-jest@latest -D 
    pnpm add @babel/core @babel/preset-env babel-plugin-transform-es2015-modules-commonjs @vue/test-utils @vue/vue3-jest jest-transform-stub @types/jest -D

    jest:提供单元测试能力
    ts-jest:Typescript 开发语言的预处理器
    @vue/test-utils:对 Vue 组件进行测试(Vue 官方提供)
    @vue/vue3-jest:将 Vue SFC(单文件组件)转换为 Jest 可执行的 JavaScript 代码
    babel-jest:将非标准 JavaScript 代码(JSX/TSX)转换为 Jest 可执行的 JavaScript 代码
    @babel/preset-env:提供测试时最新的 JavaScript 语法的 Babel Preset
    @babel/preset-typescript:提供测试时TypeScript 语法的 Babel Preset
    @vue/babel-plugin-jsx:提供测试时在 Vue 中使用 JSX/TSX 语法的 Babel Plugin
    @vitejs/plugin-vue-jsx:提供开发时在 Vue 中使用 JSX/TSX 语法的 Vite Plugin
    jest-transform-stub:将非 JavaScript 文件转换为 Jest 可执行的 JavaScript 代码

     

    3.2、根目录新建jest.config.js

    1. export default {
    2. preset: 'ts-jest',
    3. roots: ['/tests/'],
    4. clearMocks: true,
    5. moduleDirectories: ['node_modules', 'src'],
    6. moduleFileExtensions: ['js', 'ts', 'vue', 'tsx', 'jsx', 'json', 'node'],
    7. modulePaths: ['/src', '/node_modules'],
    8. testMatch: [
    9. '**/tests/**/*.[jt]s?(x)',
    10. '**/?(*.)+(spec|test).[tj]s?(x)',
    11. '(/__tests__/.*|(\\.|/)(test|spec))\\.(js|ts)$',
    12. ],
    13. testPathIgnorePatterns: [
    14. '/tests/server/',
    15. '/tests/__mocks__/',
    16. '/node_modules/',
    17. ],
    18. transform: {
    19. '^.+\\.ts?$': 'ts-jest',
    20. '^.+\\.vue$': '@vue/vue3-jest',// 使用 vue-jest 帮助测试 .vue 文件
    21. '^.+\\.(js|jsx)?$': 'babel-jest',// 遇到 js jsx 等转成 es5
    22. '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',// 遇到 css 等转为字符串 不作测试
    23. },
    24. transformIgnorePatterns: ['/tests/__mocks__/', '/node_modules/'],
    25. // A map from regular expressions to module names that allow to stub out resources with a single module
    26. moduleNameMapper: {
    27. '\\.(vs|fs|vert|frag|glsl|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
    28. '/tests/__mocks__/fileMock.ts',
    29. '\\.(sass|s?css|less)$': '/tests/__mocks__/styleMock.ts',
    30. '\\?worker$': '/tests/__mocks__/workerMock.ts',
    31. '^/@/(.*)$': '/src/$1',
    32. },
    33. testEnvironment: 'jsdom',
    34. verbose: true,
    35. collectCoverage: false,
    36. coverageDirectory: 'coverage',
    37. collectCoverageFrom: ['src/**/*.{js,ts,vue}'],
    38. coveragePathIgnorePatterns: ['^.+\\.d\\.ts$'],
    39. }

    3.3、根目录新建babel.config.js

    1. module.exports = {
    2. presets: [
    3. [
    4. "@babel/preset-env",
    5. {
    6. targets: {
    7. node: "current"
    8. }
    9. }
    10. ]
    11. ],
    12. plugins: ["transform-es2015-modules-commonjs"]
    13. }

    3.4、package.json

     "unit:test": "jest"

    3.5、根目录创建tests文件,用来放单元测试文件

    3.6、创建一个utils

    src/utils/index.ts

    1. // 数字千位分隔显示123456 =123,456
    2. export const formatNumber=(value: string) =>{
    3. value += '';
    4. const list = value.split('.');
    5. const prefix = list[0].charAt(0) === '-' ? '-' : '';
    6. let num = prefix ? list[0].slice(1) : list[0];
    7. let result = '';
    8. if (num.length > 3) {
    9. result = `,${num.slice(-3)}${result}`;
    10. num = num.slice(0, num.length - 3);
    11. }
    12. if (num) {
    13. result = num + result;
    14. }
    15. return `${prefix}${result}${list[1] ? `.${list[1]}` : ''}`;
    16. }

    3.7、创建utils的单元测试

    tests/units.spec.ts

    1. import {formatNumber} from '../src/utils/index'
    2. test('格式化数字123456显示为123,456', () => {
    3. expect(formatNumber('123456')).toBe('123,456');
    4. })

    3.8、运行pnpm unit:test

    pnpm unit:test

    测试通过

    四、过程记录

    4.1、

     解:我理解,我项目是vite项目,不是vue-cli项目,不能使用这个命令安装jest

    4.2、

     解:

    pnpm add @types/jest

    4.3、

    解:jest升级版本超过27出现的问题

    pnpm add jest-environment-jsdom

     javascript - 将 Jest 升级到 v28 - 找不到错误测试环境 jest-environment-jsdom - 堆栈内存溢出

    4.4、另外一个项目尝试使用jest遇到问题如下,未解决

    处理require is not defined in ES module scope, you can use import instead报错

    pnpm add @babel/plugin-transform-modules-commonjs

    package.json增加配置

    1. "babel": {
    2. "plugins": [
    3. "@babel/plugin-transform-modules-commonjs"
    4. ]
    5. }

    尝试了一些方法,没有成功,,后来更改了jest.config.js配置,避免了这个问题 

    4.5、

    vue-cli项目可以使用如下命令增加jest单元测试能力:

    vue add @vue/cli-plugin-unit-jest

    未测试 

    4.6、

    记得之前创建项目的时候可以选择测试工具,这里我们也尝试一些,没有发现,所以我们自己安装jest

    pnpm create vite

    亲测,新建项目,没有选择测试工具的选项,,如果后续有发现再补充

    五、欢迎交流指正,关注我,一起学习。

    参考链接:

    标签[ts-jest] 最普遍问题 - 堆栈内存溢出

    好文-vue3+vite+jest配置 单元测试总结_火辣辣-的博客-CSDN博客_vite 单元测试

    @babel/plugin-transform-modules-commonjs · Babel 中文网

    vue3 + vite + typescript + eslint + jest 项目配置实践-技术圈

    关于Vue中用jest测试_城北的徐公的博客-CSDN博客_vue-jest

    Vue3项目实践jest,学会了升职加薪(上篇)_梅花十三儿的博客-CSDN博客

    vite + vue3 + ts + jest 测试 - boyyang - 博客园

    Jest入门文档 - 掘金

    【前端测试】第0章 - 为什么要做单元测试?_哔哩哔哩_bilibili

  • 相关阅读:
    R3F(React Three Fiber)基础篇
    SpringMVC基础:@RequestMapping详解
    【算法基础】(一)基础算法 --- 快速排序
    数据链路层-概述
    [C++ 网络协议] Windows平台下的线程
    《动手学深度学习》(pytorch版+mxnet版)2023最新
    java数字翻转
    老知识复盘-SQL从提交到执行到底经历了什么 | 京东云技术团队
    计算机组成原理课程设计(1)
    quartus ii 9.0版本报错闪退
  • 原文地址:https://blog.csdn.net/snowball_li/article/details/127856079