
Nếu bạn đã phát triển các ứng dụng frontend trong vài năm gần đây, rất có thể bạn đã dành một lượng thời gian đáng kể để làm việc với Jest. Nó từng là nền tảng của việc kiểm thử JavaScript, cung cấp một môi trường mạnh mẽ, giàu tính năng và đáng tin cậy cho các nhà phát triển. Tuy nhiên, khi hệ sinh thái phát triển – đặc biệt với sự trỗi dậy của Vite và ES Modules (ESM) – kiến trúc của Jest đôi khi lại trở thành một nút thắt cổ chai.
Hãy chào đón Vitest, một framework kiểm thử đơn vị cực nhanh được cung cấp bởi Vite. Vitest không chỉ hứa hẹn tốc độ thực thi nhanh hơn, mà còn là trải nghiệm phát triển hiện đại tích hợp liền mạch với các dự án dựa trên Vite. Quy trình di chuyển toàn diện từ Jest sang Vitest.
Hệ sinh thái frontend phát triển nhanh chóng, và các công cụ chúng ta sử dụng phải theo kịp. Mặc dù Jest vẫn là một công cụ tuyệt vời, nhưng sự thay đổi mô hình sang Vite và ESM gốc đã bộc lộ một số điểm khó khăn. Dưới đây là những lý do chính bạn nên cân nhắc di chuyển:
Một trong những điểm khó khăn lớn nhất với Jest trong một dự án Vite là duy trì hai cấu hình riêng biệt. Bạn có vite.config.js cho máy chủ build và dev của mình, và jest.config.js cho các bài kiểm thử của bạn. Sự trùng lặp này thường dẫn đến sự khác biệt trong cách xử lý các alias, plugin và biến môi trường.
Vitest sử dụng cấu hình Vite hiện có của bạn. Nó hiểu các plugin, alias và chiến lược phân giải module của bạn ngay lập tức. Điều này có nghĩa là bạn duy trì một nguồn thông tin duy nhất cho cấu hình dự án của mình, giảm đáng kể độ phức tạp và chi phí bảo trì.
Jest được xây dựng trong kỷ nguyên CommonJS. Mặc dù nó đã thêm hỗ trợ thử nghiệm cho ESM, nhưng việc cấu hình nó có thể rất khó khăn, thường yêu cầu Babel hoặc các bộ chuyển đổi khác chỉ để phân tích cú pháp hiện đại. Vitest, được xây dựng trên Vite, ưu tiên ESM. Nó xử lý JavaScript và TypeScript hiện đại mà không gặp khó khăn, loại bỏ nhu cầu về các pipeline chuyển đổi phức tạp.
Vite nổi tiếng với Hot Module Replacement cực nhanh, và Vitest mang khả năng này đến trình chạy kiểm thử của bạn. Khi bạn sửa đổi một tệp, Vitest sẽ thông minh chỉ vô hiệu hóa các module cần thiết và chạy lại các bài kiểm thử bị ảnh hưởng ngay lập tức. Điều này tạo ra một vòng phản hồi tức thì, cải thiện đáng kể trải nghiệm của nhà phát triển.
Vì Vitest tận dụng công cụ chuyển đổi của Vite (esbuild) và các luồng worker Node gốc, nó cực kỳ nhanh. Đối với nhiều dự án, việc di chuyển từ Jest sang Vitest giúp giảm thời gian thực thi kiểm thử từ 2 đến 5 lần. Trong môi trường CI, điều này có nghĩa là các bản build nhanh hơn, pipeline rẻ hơn và các nhà phát triển hài lòng hơn.
Di chuyển một bộ kiểm thử lớn nghe có vẻ đáng sợ, nhưng Vitest được thiết kế để tương thích cao với API của Jest. Hầu hết các bài kiểm thử của bạn có thể sẽ chạy mà không cần sửa đổi. Hãy cùng xem xét các bước thực tế để thực hiện việc di chuyển này một cách an toàn.
Đầu tiên, chúng ta cần thêm Vitest vào dự án. Chúng ta cũng sẽ muốn cài đặt các gói UI và coverage nếu bạn dựa vào các tính năng đó.
npm install -D vitest @vitest/ui @vitest/coverage-v8
Bây giờ bạn có thể xóa Jest và các plugin liên quan của nó (như ts-jest, babel-jest, v.v.):
npm uninstall jest ts-jest @types/jest
Nếu bạn đã có vite.config.ts, bạn chỉ cần cập nhật nó để bao gồm cấu hình kiểm thử. Bạn sẽ cần sử dụng chỉ thị /// <reference types="vitest" /> hoặc import defineConfig từ vitest/config.
// vite.config.ts
import { defineConfig } from 'vitest/config'
import react from '@vitejs/plugin-react'
export default defineConfig({
plugins: [react()],
test: {
globals: true, // Enables Jest-like global APIs
environment: 'jsdom', // Use 'happy-dom' or 'jsdom' for frontend testing
setupFiles: './src/setupTests.ts',
},
})
Bằng cách đặt globals: true, Vitest sẽ tự động inject describe, it và expect vào phạm vi toàn cục của bạn, nghĩa là bạn sẽ không phải import chúng trong mỗi tệp kiểm thử.
Nếu bạn đang sử dụng @testing-library/jest-dom cho các custom matcher (như toBeInTheDocument), bạn có thể tiếp tục sử dụng nó. Chỉ cần đảm bảo tệp setup của bạn import nó một cách chính xác.
// src/setupTests.ts
import '@testing-library/jest-dom'
Đây thường là nơi chứa phần lớn công việc di chuyển thủ công. Vitest hỗ trợ mocking, nhưng API hơi khác so với Jest. Bạn sẽ cần thay thế jest.mock() bằng vi.mock() và jest.fn() bằng vi.fn().
Nếu bạn có các mock toàn cục (ví dụ: mocking window.matchMedia), hãy cập nhật chúng để sử dụng đối tượng vi:
// Before (Jest)
jest.spyOn(window, 'fetch').mockImplementation(() => { /* ... */ });
// After (Vitest)
vi.spyOn(window, 'fetch').mockImplementation(() => { /* ... */ });
Một thao tác tìm và thay thế nhanh chóng trong thư mục src/ của bạn (thay thế jest. bằng vi.) thường xử lý 90% công việc.
Nếu bạn đang thao tác với timers, cú pháp giống hệt nhau, nhưng bạn sử dụng vi thay vì jest.
// Before
jest.useFakeTimers();
jest.advanceTimersByTime(1000);
// After
vi.useFakeTimers();
vi.advanceTimersByTime(1000);
Cập nhật các script package.json của bạn để sử dụng Vitest:
{
"scripts": {
"test": "vitest",
"test:ui": "vitest --ui",
"test:coverage": "vitest run --coverage"
}
}
Bây giờ, hãy chạy các bài kiểm thử của bạn. Rất có thể một vài bài kiểm thử có thể thất bại do những khác biệt nhỏ trong cách xử lý phân giải module hoặc mocking, nhưng phần lớn sẽ vượt qua ngay lập tức. Giải quyết các lỗi còn lại một cách riêng lẻ.
Khi bạn đã có bộ kiểm thử của mình chạy xanh trên Vitest, hãy dành một chút thời gian để đánh giá tác động.
npm run test:ui, bạn sẽ có một bảng điều khiển đẹp mắt để trực quan hóa các bài kiểm thử, coverage và biểu đồ dependency của mình.Một nhóm phát triển đang di chuyển một ứng dụng frontend lớn từ Jest sang Vitest. Họ nhận thấy rằng giai đoạn test của pipeline CI/CD của họ, trước đây mất 15 phút, giờ chỉ hoàn thành trong 3 phút. Đâu là lý do kỹ thuật cơ bản QUAN TRỌNG NHẤT cho sự cải thiện hiệu suất đáng kể này?
Di chuyển từ Jest sang Vitest là một trong những nâng cấp cơ sở hạ tầng đáng giá nhất mà bạn có thể thực hiện cho một dự án frontend hiện đại. Sự thống nhất về cấu hình, hỗ trợ ESM gốc và tốc độ tuyệt vời khiến nó trở thành một niềm vui khi sử dụng.
Mặc dù Jest đã phục vụ cộng đồng rất tốt trong nhiều năm, Vitest đại diện cho sự phát triển tiếp theo của việc kiểm thử trong hệ sinh thái JavaScript. Bằng cách tuân theo một cách tiếp cận thực tế, từng bước một, bạn có thể hiện đại hóa ngăn xếp kiểm thử của mình, xóa bỏ các cấu hình phức tạp và cuối cùng dành ít thời gian hơn để chờ đợi các bài kiểm thử hoàn thành và nhiều thời gian hơn để triển khai các tính năng.
Làm sạch log AI CLI, tạo biểu thức cron, giải mã JWT và tính quyền chmod offline.

Hướng dẫn toàn diện về di chuyển từ Jest sang Vitest cho các ứng dụng React hiện đại, giúp bạn tận dụng tốc độ và hỗ trợ ESM gốc của Vitest cùng React Testing Library để viết các bộ kiểm thử bền vững, dễ bảo trì.
Đọc tiếp
Tại sao các xác nhận end-to-end truyền thống bỏ lỡ hồi quy bố cục hình ảnh, và cách các dịch vụ kiểm thử hình ảnh tự động bảo vệ giao diện người dùng responsive trong các pipeline CI.
Đọc tiếp
Tìm hiểu lý do tại sao các nhà phát triển frontend ngày càng áp dụng Rust cho tooling và WebAssembly, cùng cách bạn có thể chuyển đổi mô hình tư duy từ JavaScript/TypeScript.
Đọc tiếp