web-dev-qa-db-ja.com

Jest-簡単なテストが遅い

私はJestを使用してangularアプリをテストしていますが、簡単なテストの実行には非常に長い時間がかかり、理由を理解できないようです。

package.jsonでのJestのセットアップ:

"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

36
Tucker

また、AngularプロジェクトでJestを使用していますが、それが良い解決策かどうかはわかりません。

テストモジュールを構成するときに、NO_ERRORS_SCHEMAネストされたすべてのコンポーネントをdeclarationsに追加して、テストするコンポーネントをコンパイルする必要はありません。

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

Jestでのテストは単体テストであるため、そのソリューションではコンポーネントのみをテストします。コンポーネント間の相互作用をテストする場合は、ProtractorまたはPuppeteerを使用してエンドツーエンドのテストを行います。

2
Michael Werner

最終的には、Angularチームからの回答が必要だと思います。platformBrowserDynamicTestingのドキュメントはまばらです(- https://angular.io/api/platform-b​​rowser-dynamic/ testing/platformBrowserDynamicTesting )。

おそらく、platformBrowserDynamicTestingはブラウザをエミュレートし、アプリケーションのDOM全体をメモリにロードします。この場合、Angularアプリケーション(キャッシュされたJavaScriptなし)の場合、ほぼ10秒のランプアップが妥当と思われます。 6ミリ秒で実行されており、「高速テスト」の要件を満たしているようです。別の単純な「高速2」テストを追加すると、テストにかかる時間を確認できます。 10秒未満は、Angular platformBrowserDynamicTestingユーティリティのランプアップと比較して、実際のテストにかかる時間が非常に短いことを示しています。

2
phil