•8 min read

Di chuyển từ Jest sang Vitest: Hướng dẫn thực tế

Di chuyển từ Jest sang Vitest: Hướng dẫn thực tế

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. Trong hướng dẫn này, chúng ta sẽ khám phá những lý do thực tế để di chuyển, những lợi ích cụ thể và cách tiếp cận từng bước để chuyển bộ kiểm thử của bạn từ Jest sang Vitest mà không tốn nhiều công sức.

Audio Briefing
0:00 / 0:00

Tại sao nên di chuyển 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:

1. Cấu hình thống nhất

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ì.

2. Hỗ trợ ESM gốc

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.

3. Hot Module Replacement (HMR) cho kiểm thử

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.

4. Cải thiện hiệu suất

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.

Advertisement

Lộ trình di chuyển: Từng bước một

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.

Bước 1: Cài đặt Vitest và các dependency

Đầ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

Bước 2: Cấu hình Vitest

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ử.

Bước 3: Cập nhật các tệp Setup

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'

Bước 4: Xử lý Jest Mocks

Đâ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.

Bước 5: Timers và Mocking nâng cao

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);

Bước 6: Cập nhật Scripts và Chạy

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ẻ.

Đánh giá tác động

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.

  1. Kiểm tra tốc độ: Chạy các bài kiểm thử của bạn ở cả chế độ watch và chế độ CI. Bạn sẽ ngay lập tức nhận thấy lợi ích của HMR ở chế độ watch, và sự cải thiện tốc độ thực thi thô ở chế độ CI.
  2. Xem lại cấu hình: Xem xét bạn đã có thể xóa bao nhiêu cấu hình. Việc loại bỏ Babel, Webpack hoặc các cấu hình transformer Jest phức tạp là một chiến thắng lớn cho khả năng bảo trì của kho lưu trữ của bạn.
  3. Trải nghiệm nhà phát triển: Tận hưởng giao diện người dùng Vitest. Bằng cách chạy 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.

Kết luận

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.

Advertisement

Bạn cũng có thể thích

Share this article:

Stay Updated

Get the latest posts delivered straight to your inbox.

Free Developer Utilities

Free In-Browser Developer Tools

Clean AI CLI logs, build cron expressions, decode JWTs, and calculate chmod permissions offline.

Explore Tools
Advertisement
k6 Grafana: Kiểm thử tải phân tán & phân tích hiệu suất
testing

k6 Grafana: Kiểm thử tải phân tán & phân tích hiệu suất

Tôi từng nghĩ API của mình nhanh cho đến khi bị tấn công bởi một đợt tăng đột biến lưu lượng truy cập. Đây là cách tôi thiết lập kiểm thử tải phân tán với k6, Grafana và Prometheus để tìm ra các điểm nghẽn trước khi chúng làm sập hệ thống sản xuất.

Read more