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

简介: 单元测试(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

export default {
    preset: 'ts-jest',
    roots: ['<rootDir>/tests/'],
    clearMocks: true,
    moduleDirectories: ['node_modules', 'src'],
    moduleFileExtensions: ['js', 'ts', 'vue', 'tsx', 'jsx', 'json', 'node'],
    modulePaths: ['<rootDir>/src', '<rootDir>/node_modules'],
    testMatch: [
      '**/tests/**/*.[jt]s?(x)',
      '**/?(*.)+(spec|test).[tj]s?(x)',
      '(/__tests__/.*|(\\.|/)(test|spec))\\.(js|ts)$',
    ],
    testPathIgnorePatterns: [
      '<rootDir>/tests/server/',
      '<rootDir>/tests/__mocks__/',
      '/node_modules/',
    ],
    transform: {
      '^.+\\.ts?$': 'ts-jest',
      '^.+\\.vue$': '@vue/vue3-jest',// 使用 vue-jest 帮助测试 .vue 文件
      '^.+\\.(js|jsx)?$': 'babel-jest',// 遇到 js jsx 等转成 es5
      '.+\\.(css|styl|less|sass|scss|svg|png|jpg|ttf|woff|woff2)$': 'jest-transform-stub',// 遇到 css 等转为字符串 不作测试
    },
    transformIgnorePatterns: ['<rootDir>/tests/__mocks__/', '/node_modules/'],
    // A map from regular expressions to module names that allow to stub out resources with a single module
    moduleNameMapper: {
      '\\.(vs|fs|vert|frag|glsl|jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$':
        '<rootDir>/tests/__mocks__/fileMock.ts',
      '\\.(sass|s?css|less)$': '<rootDir>/tests/__mocks__/styleMock.ts',
      '\\?worker$': '<rootDir>/tests/__mocks__/workerMock.ts',
      '^/@/(.*)$': '<rootDir>/src/$1',
    },
    testEnvironment: 'jsdom',
    verbose: true,
    collectCoverage: false,
    coverageDirectory: 'coverage',
    collectCoverageFrom: ['src/**/*.{js,ts,vue}'],
    coveragePathIgnorePatterns: ['^.+\\.d\\.ts$'],
  }

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

module.exports = {
    presets: [
        [
            "@babel/preset-env",
            {
                targets: {
                    node: "current"
                }
            }
        ]
    ],
    plugins: ["transform-es2015-modules-commonjs"]
  }

3.4、package.json

"unit:test": "jest"

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

3.6、创建一个utils

src/utils/index.ts

// 数字千位分隔显示123456 =》123,456
  export const formatNumber=(value: string) =>{
    value += '';
    const list = value.split('.');
    const prefix = list[0].charAt(0) === '-' ? '-' : '';
    let num = prefix ? list[0].slice(1) : list[0];
    let result = '';
    if (num.length > 3) {
      result = `,${num.slice(-3)}${result}`;
      num = num.slice(0, num.length - 3);
    }
    if (num) {
      result = num + result;
    }
    return `${prefix}${result}${list[1] ? `.${list[1]}` : ''}`;
  }

3.7、创建utils的单元测试

tests/units.spec.ts

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

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增加配置

"babel": {
    "plugins": [
      "@babel/plugin-transform-modules-commonjs"
    ]
  }

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

4.5、

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

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

未测试

4.6、

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

pnpm create vite

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

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

相关文章
|
8月前
|
运维 关系型数据库 MySQL
os-copilot安装_配置_功能测试全集
我是一位中级运维工程师,我平时工作会涉及到 各类服务器的 数据库 与 java环境配置 操作。 我顺利使用了OS Copilot的 -t -f | 功能,我的疑惑是不能在自动操作过程中直接给与脚本运行权限,必须需要自己运行一下 chmod 这个既然有了最高的权限,为什么就不能直接给与运行权限呢。 我认为 -t 功能有用,能解决后台运行基础命令操作。 我认为 -f 功能有用,可以通过task文件中撰写连续任务操作。 我认为 | 对文件理解上有很直接的解读,可以在理解新程序上有很大帮助。
263 86
|
7月前
|
存储 人工智能 编译器
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
289 10
【03】鸿蒙实战应用开发-华为鸿蒙纯血操作系统Harmony OS NEXT-测试hello word效果-虚拟华为手机真机环境调试-为DevEco Studio编译器安装中文插件-测试写一个滑动块效果-介绍诸如ohos.ui等依赖库-全过程实战项目分享-从零开发到上线-优雅草卓伊凡
|
5月前
|
SQL 缓存 关系型数据库
MySQL8.4 Enterprise安装Firewall及测试
MySQL8.4 Enterprise安装Firewall及测试
134 0
|
6月前
|
人工智能 测试技术 API
Windows用户必备:Postman v11详细安装指南与API测试入门教程(附官网下载
Postman是全球领先的API开发与测试工具,支持REST、SOAP、GraphQL等协议调试。2025年最新版v11新增AI智能生成测试用例、多环境变量同步等功能,适用于前后端分离开发、自动化测试、接口文档自动生成及团队协作共享API资源。本文详细介绍Postman的软件定位、核心功能、安装步骤、首次配置、基础使用及常见问题解答,帮助用户快速上手并高效利用该工具进行API开发与测试。
|
8月前
|
弹性计算 Ubuntu Java
OS-Copilot-ubuntu镜像版本的具体测试使用(安装方式有单独注明)
作为一名个人开发者,我主要负责云资源的运维和管理。在使用OS Copilot的过程中,我遇到了一些配置问题,特别是在ECS实例中设置AccessKey时,但最终成功解决了。通过使用OS Copilot的-t/-f/管道功能,我大大提升了效率,减少了命令编写的工作量,特别是在搭建Java运行环境时效果显著。此外,| 功能帮助我快速理解文档,整体体验非常流畅,推荐给其他开发者使用。
192 6
|
8月前
|
弹性计算 运维 Ubuntu
os-copilot在Alibaba Cloud Linux镜像下的安装与功能测试
我顺利使用了OS Copilot的 -t -f 功能,我的疑惑是在换行的时候就直接进行提问了,每次只能写一个问题,没法连续换行更有逻辑的输入问题。 我认为 -t 管道 功能有用 ,能解决环境问题的连续性操作。 我认为 -f 管道 功能有用 ,可以单独创建可连续性提问的task问题。 我认为 | 对文件直接理解在新的服务器理解有很大的帮助。 此外,我还有建议 可以在非 co 的环境下也能进行连续性的提问。
187 7
|
10月前
|
JavaScript 安全 编译器
TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法
本文深入探讨了 TypeScript 与 Jest 测试框架的结合使用,从 TypeScript 的测试需求出发,介绍了 Jest 的特点及其与 TypeScript 结合的优势,详细讲解了基本测试步骤、常见测试场景及异步操作测试方法,并通过实际案例展示了其在项目中的应用效果,旨在提升代码质量和开发效率。
212 6
|
11月前
|
自然语言处理 机器人 Python
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
ChatPaper是一个基于文本生成技术的智能研究论文工具,能够根据用户输入进行智能回复和互动。它支持快速下载、阅读论文,并通过分析论文的关键信息帮助用户判断是否需要深入了解。用户可以通过命令行或网页界面操作,进行论文搜索、下载、总结等。
277 1
ChatGPT使用学习:ChatPaper安装到测试详细教程(一文包会)
|
10月前
|
前端开发 数据管理 测试技术
前端自动化测试:Jest与Cypress的实战应用与最佳实践
【10月更文挑战第27天】本文介绍了前端自动化测试中Jest和Cypress的实战应用与最佳实践。Jest适合React应用的单元测试和快照测试,Cypress则擅长端到端测试,模拟用户交互。通过结合使用这两种工具,可以有效提升代码质量和开发效率。最佳实践包括单元测试与集成测试结合、快照测试、并行执行、代码覆盖率分析、测试环境管理和测试数据管理。
360 2
|
10月前
|
JavaScript 测试技术 API
Jest进阶:测试 Vue 组件
Jest进阶:测试 Vue 组件

热门文章

最新文章