javascript - Jest - Các bài kiểm tra đơn giản chạy chậm
Tôi đang sử dụng Jest để kiểm tra một ứng dụng Angular và mất rất nhiều thời gian để chạy các bài kiểm tra đơn giản và tôi dường như không thể tìm ra lý do tại sao.
Cấu hình Jest của tôi trong package.json:
"jest": {
"modulePaths": [
"<rootDir>/src",
"<rootDir>/node_modules"
],
"testPathIgnorePatterns": [
".git/.*",
"node_modules/.*"
],
"transformIgnorePatterns": [
"node_modules/.*",
".*\\.js"
],
"setupTestFrameworkScriptFile": "<rootDir>/src/setupJest.js",
"preset": "jest-preset-angular",
"testEnvironment": "jsdom",
"testRegex": "src/app/.*\\.spec\\.ts$",
"moduleFileExtensions": [
"ts",
"js",
"json"
],
"verbose": true,
"cacheDirectory": ".jest-cache",
"coveragePathIgnorePatterns": [
".*\\.(shim\\.ngstyle|ngfactory)\\.ts"
],
"globals": {
"ts-jest": {
"tsConfigFile": "./tsconfig.json"
},
"__TRANSFORM_HTML__": true
}
}
Tệp thiết lập Jest của tôi:
'use strict';
require('core-js/es6/reflect');
require('core-js/es7/reflect');
require('zone.js');
require('zone.js/dist/proxy.js');
require('zone.js/dist/sync-test');
require('zone.js/dist/async-test');
require('zone.js/dist/fake-async-test');
require('jest-zone-patch');
const getTestBed = require('@angular/core/testing').getTestBed;
const BrowserDynamicTestingModule = require('@angular/platform-browser-dynamic/testing').BrowserDynamicTestingModule;
const platformBrowserDynamicTesting = require('@angular/platform-browser-dynamic/testing') .platformBrowserDynamicTesting;
getTestBed().initTestEnvironment(
BrowserDynamicTestingModule,
platformBrowserDynamicTesting()
);
Đây là bài kiểm tra đơn giản của tôi:
fdescribe('RichTextEditorComponent', () => {
it('should be fast', () => {
expect(true).toBeTruthy();
});
});
Có ai biết lý do tại sao việc này lại mất hơn 9 giây không?
Câu trả lời #1
Một khả năng khác là ts-jest chạy chậm. Đã có một vấn đề về điều đó, và nó chưa được giải quyết hoàn toàn.
Có nhiều cách giải quyết tạm thời được thảo luận. Chúng bao gồm việc thiết lập isolatedModules=true và cũng --maxWorkers=1. Tức là, trong jest.config.js
'use strict';
module.exports = {
preset: 'ts-jest',
testEnvironment: 'node',
globals: {
'ts-jest': {
isolatedModules: true
}
},
}
và chạy
yarn test --maxWorkers=1
Có thể đáng thử. Ngoài ra, có thể bỏ qua ts-jest và sử dụng transpilation bằng babel.
Câu trả lời #2
Giải pháp: SWC (Trình biên dịch Web Nhanh)
ts-jest rất có thể đang làm chậm các bài kiểm tra.
SWC là một lựa chọn thay thế dễ sử dụng, được viết bằng Rust và cực kỳ nhanh. Hơn 10 lần cải thiện đối với tôi. link
cài đặt
if you use npm
npm i -D @swc/core @swc/jest
if you use yarn
yarn add -D @swc/core @swc/jest
Bên trong jest.config.js, cấu hình Jest để sử dụng SWC:
module.exports = {
transform: {
"^.+\\.(t|j)sx?$": ["@swc/jest"],
},
};
sử dụng
yarn jest --runInBand
lưu ý: phiên bản jest 28 hiện không ổn định. Tôi sử dụng 27.0.4
Thay thế: ESBuild
bạn cũng có thể sử dụng esbuild được viết bằng Go, cũng rất nhanh. (hiệu suất tương tự như swc)
yarn add -D esbuild-jest esbuild
Bên trong jest.config.js, cấu hình Jest để sử dụng esbuild
module.exports = {
transform: {
"^.+\\.(t|j)sx?$": ["esbuild-jest"],
},
};
được truyền cảm hứng từ speeding-up-jest
Câu trả lời số 3
Đọc hai liên kết này:
- https://itnext.io/how-to-make-your-sluggish-jest-v23-tests-go-faster-1d4f3388bcdd
- https://github.com/facebook/jest/issues/7963
Đây là một danh sách những điều cần cân nhắc. Chúng không dành riêng cho trường hợp của bạn, nhưng vì tiêu đề của câu hỏi khá chung chung, tôi nghĩ chúng có thể giúp một phần số lượng người truy cập. Chúng không nên được thử một cách mù quáng, chúng chỉ đơn giản là điểm khởi đầu để nghiên cứu.
Những điều nên thử để tăng tốc các bài kiểm tra jest của bạn:
Chạy ở chế độ theo dõi với
--watchjest tối ưu hóa khi bạn sử dụng
--watch.chạy trên máy chủ của bạn thay vì trong docker? -> Trước đây tôi đã sử dụng
docker exec -it <tên_container> yarn testvà thấy nhanh hơn khi tôi chuyển sang sử dụng máy chủ của mình.nâng cấp phiên bản jest dường như có một số lỗi khiến một số phiên bản chạy chậm hơn https://github.com/facebook/jest/pull/8046
lưu ý: rằng
yarn upgradetuân theo các ký hiệu phiên bản ~ và ^, nếu bạn biết mình đang làm gì, bạn có thể chỉ muốn gỡ bỏ và thêm lạiyarn remove jestyarn add -D jestđiều đó sẽ chỉ giúp bạn có phiên bản mới nhấtthay đổi môi trường kiểm thử từ jsdom sang node
"jest": {
"testEnvironment": "node"
}
- Chạy các bài kiểm tra một cách đồng bộ.. có cho phép jest tối ưu không?
thêm tùy chọn --runInBand
- Thiết lập số lượng công nhân tối đa có thể làm cho nó nhanh hơn?
thêm tùy chọn --maxWorkers=4
Trong trường hợp của tôi, tôi đã nâng cấp phiên bản jest, bắt đầu sử dụng --watch và --runInBand và chạy trên máy chủ của tôi thay vì qua docker, và thời gian kiểm tra của tôi đã giảm từ 2 phút xuống 10 giây. Tôi không biết vấn đề chính xác là gì trong trường hợp của tôi.
Câu trả lời #4
2023 - Thử cái này:
globals: {
"ts-jest": {
isolatedModules: true
}
}
và chạy
yarn test
