Vitest 快速上手
前置阅读:前端自动化测试概述
0x01 概述
-
特点:
- 原生支持并由 Vite 驱动
- 兼容 Jest
- 支持 ESM、TypeScript、JSX
-
创建项目与第一个测试用例
-
使用命令
npm create vite@latest创建基于 Vite 构建的项目 -
选择 React 项目 + JavaScript
-
进入项目目录并使用命令
npm install安装依赖 -
使用命令
npm install --save-dev vitest jsdom @testing-library/jest-dom @testing-library/react @testing-library/user-event @testing-library/jest-dom安装 Vitest、Testing Library 及其相关依赖 -
在根目录创建 tests\setup.js 目录及文件,并编辑
import '@testing-library/jest-dom'; import { cleanup } from "@testing-library/react"; import { afterEach, vi } from "vitest"; afterEach(() => { cleanup(); vi.clearAllMocks(); }); -
修改 vite.config.js
import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; export default defineConfig({ plugins: [react()], test: { globals: true, environment: "jsdom", setupFiles: "./tests/setup", }, }); -
在 src 目录下创建 utils.test.js 并编辑
import { describe, expect, it } from "vitest"; describe("utils", () => { it("1 + 1 = 2", () => { expect(1 + 1).toEqual(2); }); }); -
修改 package.json,在 scripts 中新增以下内容
"test": "vitest" -
使用命令
npm run test执行测试
-
0x02 JavaScript 代码单元测试
-
在 src 目录下新建 utils.js
export const range = (start, end) => [...Array(end - start).keys()].map((el) => el + start); -
修改 utils.test.js
import { describe, expect, it } from "vitest"; import { range } from "./utils"; describe("utils", () => { it("返回正确结果 1 到 5", () => { const result = range(1, 6); expect(result).toEqual([1, 2, 3, 4, 5]); }); it("返回正确结果 12 到 13", () => { const result = range(12, 14); expect(result).toEqual([12, 13]); }); });
0x03 React 组件测试
以提示框为例
-
在 src 目录下创建 components\toast.jsx
function Toast({ msg = "内容" }) { return <div data-testid="message-container">{msg}</div>; } export default Toast; -
在同目录下创建 toast.test.jsx
import { render, screen } from "@testing-library/react"; import { describe, expect } from "vitest"; import Toast from "./toast"; const message = "Hello World!"; describe("toast", () => { it("提示内容", () => { render(<Toast />); const element = screen.getByTestId("message-container"); expect(element.textContent).toEqual("内容"); }); it(`提示 ${message}`, () => { render(<Toast msg={message} />); const element = screen.getByTestId("message-container"); expect(element.textContent).toEqual(message); }); });
0x04 事件测试
以分页器为例
-
在 components 目录下创建 pagination.jsx
import { range } from "../utils"; function Pagination({ total, limit, currentPage, selectPage }) { const count = Math.ceil(total / limit); const pages = range(1, count + 1); return ( <ul> {pages.map((page) => ( <li data-testid="page-container" key={page} onClick={() => selectPage(page)} className={{ "page-item": true, active: currentPage === page, }} > <span className="page-link">{page}</span> </li> ))} </ul> ); } export default Pagination; -
在同目录下创建 pagination.test.jsx
import { render, screen } from "@testing-library/react"; import { describe, expect, it, vi } from "vitest"; import Pagination from "./pagination"; import userEvent from "@testing-library/user-event"; describe("pagation", () => { it("测试分页", () => { render(<Pagination total={50} limit={10} currentPage={1} />); const elements = screen.getAllByTestId("page-container"); expect(elements).toHaveLength(5); expect(elements[0]).toHaveTextContent("1"); }); it("测试点击事件", async () => { const user = userEvent.setup(), handleClick = vi.fn(); render( <Pagination total={50} limit={10} currentPage={1} selectPage={handleClick} /> ); const elements = screen.getAllByTestId("page-container"); await user.click(elements[0]); expect(handleClick).toHaveBeenCalledOnce(); expect(handleClick).toHaveBeenCalledWith(1); }); });
0x05 结合 Vue
-
使用命令
npm create vite@latest创建基于 Vite 构建的项目 -
选择 Vue 项目 + JavaScript
-
进入项目目录并使用命令
npm install安装依赖 -
使用命令
npm install --save-dev vitest jsdom @testing-library/jest-dom @testing-library/vue @testing-library/user-event安装 Vitest、Testing Library 及其相关依赖 -
在根目录创建 tests\setup.js 目录及文件,并编辑
import "@testing-library/jest-dom"; import { cleanup } from "@testing-library/vue"; import { afterEach, vi } from "vitest"; afterEach(() => { cleanup(); vi.clearAllMocks(); }); -
修改 vite.config.js
import { defineConfig } from "vite"; import vue from "@vitejs/plugin-vue"; export default defineConfig({ plugins: [vue()], test: { globals: true, environment: "jsdom", setupFiles: "./tests/setup", }, }); -
在 src 目录下创建 App.test.js 并编辑
import userEvent from "@testing-library/user-event"; import { render, screen } from "@testing-library/vue"; import { describe, expect, it } from "vitest"; import App from "./App.vue"; import HelloWorld from "./components/HelloWorld.vue"; const user = userEvent.setup(); describe("App", () => { it("元素存在", () => { render(App); const element = screen.getByAltText("Vue logo"); expect(element).toBeInTheDocument(); }); }); describe("HelloWorld", () => { it("计数器增加", async () => { render(HelloWorld); const element = screen.getByText("count is 0"); await user.click(element); expect(element).toHaveTextContent("count is 1"); }); }); -
修改 package.json,在 scripts 中新增以下内容
"test": "vitest" -
使用命令
npm run test执行测试
-End-

浙公网安备 33010602011771号