Jest - Простые тесты медленны

Я использую Jest для тестирования углового приложения, и для выполнения простых тестов требуется очень много времени, и я не могу понять, почему.

Моя настройка Jest в 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
  }
}

Мой установочный файл Jest:

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

Вот мой простой тест:

fdescribe('RichTextEditorComponent', () => {
  it('should be fast', () => {
    expect(true).toBeTruthy();
  });
});

Кто-нибудь знает, почему это занимает 9+ секунд? enter image description here

Ответ 1

Я также использую Jest в своем проекте Angular, и я не уверен, что это хорошее решение.

Когда вы конфигурируете свой модуль тестирования, вы можете использовать NO_ERRORS_SCHEMA и вам не нужно добавлять все вложенные компоненты в declarations для компиляции компонента, который вы хотите протестировать.

beforeEach(async () => {
    return TestBed.configureTestingModule({
      declarations: [
        MyComponent
      ],
      schemas: [NO_ERRORS_SCHEMA]
    }).compileComponents();
  });

Ваши тесты с Jest - это модульные тесты, поэтому с этим решением вы будете тестировать только свой компонент. Если вы хотите проверить взаимодействие между компонентами, вы будете выполнять сквозные тесты с Protractor или Puppeteer.

Ответ 2

Я думаю, что ответ в конечном итоге должен прийти от команды Angular. Документация для platformBrowserDynamicTesting немногочисленна (https://angular.io/api/platform-browser-dynamic/testing/platformBrowserDynamicTesting).

Возможно, platformBrowserDynamicTesting эмулирует браузер и загружает весь DOM для вашего приложения в память. В этом случае разумное увеличение скорости приложения Angular на 10 секунд (без какого-либо кэшированного JavaScript). Возможно, я неверно истолковываю это, но, согласно вашим отчетам, похоже, что настоящий тест выполняется за 6 миллисекунд, что, по-видимому, должно соответствовать вашему требованию "быстрого теста". Мне было бы интересно узнать, сколько времени займет тестирование, если вы добавите еще один простой тест "должно быть быстро 2". Если общее количество по-прежнему меньше 10 секунд, это говорит о том, что ваши реальные тесты занимают очень мало времени по сравнению с развертыванием утилиты Angular platformBrowserDynamicTesting.