Vitest 学习与实践总结:在 React + TypeScript 项目中快速上手单元测试

Vitest 学习与实践总结:在 React + TypeScript 项目中快速上手单元测试

今天我用4个小时学习和实践了 Vitest 这个前端测试工具。主要是了解一下它是什么,怎么用,尤其是怎么在我们常用的 React + TypeScript 项目里用。下面是我学习的一个简单总结和记录。

一、Vitest 是个啥?

简单来说,Vitest 就是一个用来给代码做测试的工具,比如测试一个函数能不能正常工作,或者一个 React 组件显示得对不对。

它最大的特点是,而且和 Vite 项目(我们现在用的项目构建工具)搭配起来特别方便,几乎不需要做太多额外的配置。

二、为啥要用它?(它的好处)
  1. 速度快:因为它用到了 Vite 的一些特性,每次跑测试的时候几乎不需要重新打包,所以感觉测试跑起来飞快,节省时间。
  2. 开箱即用:对于我们这种用 Vite 创建的 React+TS 项目,不用折腾太多配置就能直接用,很方便。
  3. 和 Jest 差不多:它的写法和用法和另一个流行的测试工具 Jest 很像,所以如果以前写过 Jest,学起来就非常容易。
三、在 React + TypeScript 项目里怎么用?

我跟着教程和文档,大概走了下面几个步骤:

1. 安装东西

首先在项目里安装了 Vitest 和另外一个用来测试 React 组件的库(叫 @testing-library/react),安装命令大概是这样的:

dart 复制代码
npm install -D vitest @testing-library/react @testing-library/jest-dom jsdom

2. 创建配置文件

在项目根目录创建了一个 vitest.config.ts 文件,进行一些简单配置,告诉 Vitest 要用哪个环境(比如 jsdom 来模拟浏览器环境)。

javascript 复制代码
// vitest.config.ts
import { defineConfig } from 'vitest/config';
import react from '@vitejs/plugin-react';

export default defineConfig({
  plugins: [react()],
  test: {
    environment: 'jsdom',
  },
});

3. 写一个简单的测试例子

我学着给一个最简单的组件写测试。比如,我们有一个按钮组件 Button.tsx

  • 组件代码(Button.tsx)

    typescript 复制代码
    interface ButtonProps {
      text: string;
      onClick: () => void;
    }
    export const Button = ({ text, onClick }: ButtonProps) => {
      return <button onClick={onClick}>{text}</button>;
    };
  • 测试代码(Button.test.ts)

在旁边创建一个测试文件,用来检查这个组件能不能正常显示文字,以及点击能不能生效。

javascript 复制代码
import { describe, it, expect, vi } from 'vitest'; // 从vitest引入工具
import { render, screen, fireEvent } from '@testing-library/react'; // 引入React测试库
import { Button } from './Button'; // 引入要测试的组件

describe('Button 组件', () => {
  it('应该在页面上正确显示文字', () => {
    // 1. 渲染组件
    render(<Button text="点击我" onClick={() => {}} />);
    // 2. 在屏幕上找到包含"点击我"文字的元素
    const buttonElement = screen.getByText('点击我');
    // 3. 断言(期望)这个元素确实在文档里
    expect(buttonElement).toBeInTheDocument();
  });

  it('点击按钮时应该调用传入的函数', () => {
    // 1. 创建一个模拟函数,用来检查它有没有被调用
    const mockClick = vi.fn();
    // 2. 渲染组件
    render(<Button text="点击我" onClick={mockClick} />);
    // 3. 找到按钮
    const buttonElement = screen.getByText('点击我');
    // 4. 模拟一次点击事件
    fireEvent.click(buttonElement);
    // 5. 断言(期望)我们传入的模拟函数被调用了一次
    expect(mockClick).toHaveBeenCalledTimes(1);
  });
});

4. 运行测试

最后在 package.json 里加一个命令,然后运行它就能看到测试结果了。

json 复制代码
// package.json
"scripts": {
  "test": "vitest"
}

在终端里跑命令:

arduino 复制代码
npm run test

如果测试通过了,终端里就会显示绿色的对勾,告诉你所有测试都成功了,看着很有成就感。

四、对于组件来说,应该测试哪些方面?

像用户一样思考

测试类型 关键问题
✅ 渲染测试 用户看到了什么?
✅ 交互测试 用户操作后发生了什么?
✅ Props 测试 不同输入下行为是否正确?
✅ 条件渲染 内容是否在正确时机显示/隐藏?
✅ 异步测试 数据加载后 UI 是否更新?
  • @testing-library/react:用于渲染和查询

  • @testing-library/jest-dom:提供 toBeInTheDocument() 等断言

  • vi.fn() / vi.spyOn():模拟函数

  • waitFor / findBy:处理异步

  • userEvent(比 fireEvent 更真实)

具体场景

场景 推荐测试方式
按钮、输入框、卡片等 UI 组件 测试渲染 + 交互
表单组件 测试输入、验证、提交
模态框、下拉菜单 测试显示/隐藏、点击遮罩关闭
列表组件 测试数据渲染、空状态、加载状态
容器组件(带逻辑) 模拟 API,测试数据流
自定义 Hook 单独测试 Hook 行为(用 renderHook
四、总结

通过今天的学习,我感觉 Vitest 确实很简单易用,配置起来不麻烦,写测试的语法也很清晰。对于我们现在的项目来说,是一个很不错的选择。

相关推荐
汽车仪器仪表相关领域2 小时前
GZCVL T-II 安全防坠器测试系统
功能测试·测试工具·安全·单元测试·压力测试·可用性测试
用户47949283569156 小时前
给前端明星开源项目Biome提 PR,被 Snapshot 测试坑了一把
前端·后端·测试
小明的小名叫小明7 小时前
Solidity入门(14)-Hardhat 3 单元测试基础与技巧
单元测试·区块链·solidity·hardhat
编程武士8 小时前
特性测试(Characterization Test):遗留系统重构的“行为保险“
重构·测试
音浪豆豆_Rachel9 小时前
Flutter跨平台通信的实战演练:复杂数据结构与单元测试在鸿蒙生态中的完美实现
数据结构·flutter·单元测试·harmonyos
白露与泡影10 小时前
Java单元测试、集成测试,区别
java·单元测试·集成测试
汽车仪器仪表相关领域11 小时前
ZRT-V 机器人减速器寿命测试系统:精准破解 “寿命焦虑” 的核心测试方案
人工智能·功能测试·机器学习·单元测试·机器人·可用性测试·安全性测试
Python私教1 天前
鸿蒙应用的测试和调试完全指南:从单元测试到性能分析
华为·单元测试·harmonyos
realhuizhu2 天前
周五下午5点改完的代码,你敢直接发布上线吗?
自动化测试·单元测试·ai编程·测试驱动开发·代码质量
转转技术团队2 天前
从"人工催办"到"AI 规则驱动":我们如何解放测试团队的生产力
测试