首页/文章/前端

完全掌握vue全家桶单元测试 : 2. 搭建 vitest 环境搭建 vitest 环境

2024-09-09
16206 分钟
...

完全掌握vue全家桶单元测试 : 2. 搭建 vitest 环境

假设我们没有写过 vue 的单元测试,我们初始化一个全新的项目,只要在初始化 vue 项目的时候,使用 vue 自带的脚手架命令,就可以自动安装好一整套的测试环境,vitest + @vue/test-utils.

安装

pnpm create vue@latest

项目初始化成功之后,打开 vitest.config.ts 就可以看到如下的单元测试配置, f

export default mergeConfig(
  viteConfig,
  defineConfig({
    test: {
     
    }
  })
)

打开命令行执行pnpm run test:unit 命令行就会输出如下的日志,代表 HelloWorld 组件的单元测试通过了✅

我们打开 HelloWorld.spec.ts 组件,把 Hello Vitest 改成 Hello Vitest1 ,命令行就会出现失败场景❌

单元测试配置的三种方式,可以具体讲一下

测试具体某一个文件,有时候测试用例特别多,第一次测试执行用例会比较久,我们只想快速测这一个文件

pnpm run test:unit  src/components/__tests__/HelloWorld.spec.ts

默认 vitest 运行就是带热更新监听文件的,如果想不需要热更新的一次性命令如下

pnpm run test:unit run  src/components/__tests__/HelloWorld.spec.ts

报告器

报告器通俗解释,就是报告用什么方式呈现,json、html、展示的内容是详细还是简略的,可以使用 --reporter 命令行选项,或者在你的 outputFile配置选项 中加入 reporters 属性来选择不同的报告器。如果没有指定报告器,Vitest 将使用下文所述的默认报告器。 报告器可以组合使用,并以不同格式打印测试结果。

默认情况下,成功和错误的日志会输出到控制台,如果用例很多,错误也很多,那看起来会非常不方便,我选择如下配置,命令行、html、json 都能看到日志的输出,当然,这个按个人喜好修改


  defineConfig({
    test: {
     
      reporters: ['verbose', 'html', 'json'], 
      outputFile: {
        json: './test/json-report.json',
        html: './test/index.html'
      }
    }
  })

然后我们打开 pacage.json , 加入下面这行

 "preview:test": "vite preview --outDir test",

然后执行 pnpm run preview:test,会看到一个可视化的页面,页面会更加直观

所以我们如果想运行测试命令,然后在命令行看到测试结果,又想要在浏览器上 preview 测试结果,那就需要运行两个终端

pnpm run preview:testpnpm run test:unit

Vitest UI

vitest 提供一个漂亮的 UI 界面来查看并与测试交互,原本需要开两个终端,现在只需要一个了,且功能更好用,接下来我们一步一步安装

pnpm i @vitest/ui -D

在package.json添加

"vitest:ui": "vitest --ui",

最后,你可以访问 Vitest UI 界面,通过 http://localhost:51204/__vitest__/

覆盖率

覆盖率就是你的测试代码覆盖你想测试的函数或者组件的比例,具体我们先不讲,后续再仔细讲解,我们先把他配置上去

coverage: {
        enabled: true,
        reporter: ['text', 'json', 'html']
}

配置好之后,我们可以直接在 Vitest ui 上多一个图标,点击试试吧

globals

我们在写单元测试的时候,每一个单元测试文件都需要引入测试框架 vitest,会很繁琐,例如

import { describe, it, expect } from 'vitest'

可以在 vitest.config.ts 添加 global配置,这样就相当于全局引入了 Vitest,不需要每一个文件都引入

 globals: true

但发现去掉之后,编辑器会提示 describe 和 it 未定义的错误,是因为错误是 eslint 提示的,我们需要再安装一个插件

pnpm i  eslint-plugin-vitest-globals -D 

在eslint.js里面添加

module.exports = {
    extends: [
        'plugin:vitest-globals/recommended',
    ],
    overrides: [
        {
          files: [
            '**/__tests__/*.{j,t}s?(x)',
            '**/tests/unit/**/*.spec.{j,t}s?(x)',
            '**/*.test.{j,t}s?(x)'
          ],
          env: {
            'vitest-globals/env': true
          }
        }
     ],
}

在 tsconfig.vitest.json 添加

 "types": [
      "node",
      "jsdom",
      "vitest/globals"
    ]

environment

  • 类型:  'node' | 'jsdom' | 'happy-dom' | 'edge-runtime' | string

Vitest 中的默认测试环境是一个 Node.js 环境。如果你正在构建 Web 端应用,你可以使用 jsdom 或 happy-dom 这种类似浏览器(browser-like)的环境来替代 Node.js。 如果你正在构建边缘计算函数,你可以使用 edge-runtime 环境

因为我们需要测试 vue ,它是需要在 dom 环境下运行的,所以我们使用 jsdom,顺便说一下,如果用到浏览器平台相关的 api ,都要使用 jsdom,例如 localStorag.setItem 是不能在 node 环境下运行的

environment: 'jsdom',

exclude

匹配排除测试文件的 glob 规则,根据项目目录配置,例如把 e2e 文件夹排除掉

exclude: [...configDefaults.exclude, 'e2e/*'],

附加

完整配置

import { fileURLToPath } from 'node:url'
import { mergeConfig, defineConfig, configDefaults } from 'vitest/config'
import viteConfig from './vite.config'
export default mergeConfig(
  viteConfig,
  defineConfig({
    test: {
      globals: true,
      environment: 'jsdom',
      exclude: [...configDefaults.exclude, 'e2e/*'],
      root: fileURLToPath(new URL('./', import.meta.url)),
      reporters: ['verbose', 'html', 'json'],
      outputFile: {
        json: './test/json-report.json',
        html: './test/index.html'
      },
      coverage: {
        enabled: true,
        reporter: ['text', 'json', 'html']
      }
    }
  })
)

课件地址

上面的代码,都放到了 github 上,欢迎点赞收藏,我会持续更新代码和文章,消息窗口我,或者直接加我 wechat: match124

往期文章

完全掌握vue全家桶单元测试 : 1. 为什么需要前端测试

完全掌握vue全家桶单元测试 : 2. 搭建 vitest 环境

完全掌握vue全家桶单元测试 : 3. vitest 用法概览

完全掌握vue全家桶单元测试 : 4.断言常用方法

完全掌握vue全家桶单元测试 : 5.组件基本测试

完全掌握vue全家桶单元测试 : 6. 深入理解组件测试

完全掌握vue全家桶单元测试 : 7. 事件处理

完全掌握vue全家桶单元测试 : 8. mock 与替身技巧大全

完全掌握vue全家桶单元测试 : 9. timer 测试

完全掌握vue全家桶单元测试 :10. 如何测试浏览器原生方法

如果你有疑惑或者更好的建议欢迎加我微信拉你进群一起学习和讨论

如果您觉得这篇文章有帮助,请点个赞吧~

分享文章

相关文章

更多文章 →
前端2026-07-17
HTML Form 可以把 POST 响应加载进 iframe
在接入支付验证、身份认证或第三方授权页面时,我们经常会遇到这样的流程: 1. 后端返回一个第三方接口地址。 2. 这个地址必须通过 请求访问。 3. 接口返回 HTML,或者重定向到真正的验证页面。 4. 验证页面需要嵌入当前网站,而不是打开新标签页。 5. 验证完成后,当前页面继续执行后续业务。 第一次遇到这个需求,很容易想到: 但涉及第三方支付时,这种方式通常会遇到 CORS、Cookie、重定向和跨域页面读取限制。 实际上,HTM...
学习
前端2026-05-29
前端判断一个网页是否允许被 iframe 内嵌
前端 不能 100% 准确提前判断 一个网页是否允许被 iframe 内嵌,因为决定权主要在目标网站返回的 HTTP 响应头 里,而普通前端 JS 通常读不到跨域页面的响应头。 核心判断看这两个东西: 1. 老一点但仍常见。 表示完全不允许被 iframe 嵌入。 表示只允许同源页面 iframe 嵌入。 以前有这个,但现代浏览器支持很差,基本不建议依赖。 2. 现在更推荐看这个。 表示不允许任何页面嵌入。 表示只允许同源嵌入。 表示只...
学习
前端2026-03-20
网页唤起 Android App 调试笔记(App Links)
  在最近的项目中,我遇到了 网页访问特定 URL 应该唤起 Android App,但实际只打开网页 的问题。通过调试和排查,整理出以下经验和步骤。 1\. 项目与环境信息(脱敏处理) 网站域名: 唤起页面: Android App 包名: intent filter 配置示例: assetlinks.json 已上线,包含 App 的 SHA256 签名指纹 2\. 问题现象 用户访问 页面时, 网页打开了,但 App 没...
学习
前端2026-03-02
深入理解 Cookie:安全属性、访问边界与渲染场景实践
本文系统梳理 Cookie 核心机制,聚焦 HttpOnly/SameSite 等安全属性 、 访问权限边界 、 CSR/SSR 差异 ,附关键代码示例与安全清单。适合开发查阅与知识沉淀。 一、Cookie 是什么?为什么需要它? HTTP 是无状态协议。Cookie 是服务端通过 响应头下发、浏览器自动存储并在后续 同源请求中携带 的小型文本数据(通常 ≤4KB),用于: 会话维持(Session ID) 用户偏好(语言/主题) 跨请...
学习
前端2026-03-02
退出登录时 Cookie 清除指南
核心结论 :登出 ≠ 单方面操作。HttpOnly 与非 HttpOnly Cookie 需 前后端协同清除 ,缺一不可。残留 Cookie = 安全隐患 + 用户体验漏洞。 🔒 为什么不能“一键清空”? 浏览器出于安全设计: 后端 :只能通过 响应头清除 自己设置过 的 Cookie(需属性完全匹配) 前端 JS :可读写非 HttpOnly Cookie,但 无法触碰 HttpOnly Cookie 无“清除全部”API :任何服...
学习
前端2025-12-15
懒加载图片在同一个 Item 中逐个出现的原因与解决方案
懒加载图片在同一个 Item 中逐个出现的原因与解决方案 适用场景 :使用原生 实现图片懒加载的动态列表,每个列表项(item)包含多张图片。 📌 问题描述 在开发一个动态渲染的列表时,每个 item 中包含三张图片,并使用 HTML 原生的懒加载属性: 观察到的现象: 开启懒加载时 :三张图片 不是同时出现 ,而是 从左到右(或从上到下)依次加载显示 ,有明显的时间差。 关闭懒加载(移除 )后 :三张图片 看起来是一起出现的 ,视觉...
学习

评论

请登录后发表评论

去登录
加载评论中...

目录