Tìm kiếm trang web

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:

  1. Chạy ở chế độ theo dõi với --watch

    jest tối ưu hóa khi bạn sử dụng --watch.

  2. 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 test và thấy nhanh hơn khi tôi chuyển sang sử dụng máy chủ của mình.

  3. 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 upgrade tuâ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ại yarn remove jest yarn add -D jest điều đó sẽ chỉ giúp bạn có phiên bản mới nhất

  4. thay đổi môi trường kiểm thử từ jsdom sang node

"jest": {
  "testEnvironment": "node"
}
  1. 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

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

Bài viết liên quan