web-dev-qa-db-fra.com

Blague - Les tests simples sont lents

J'utilise Jest pour tester une application angular et cela prend très longtemps pour que des tests simples s'exécutent et je n'arrive pas à comprendre pourquoi.

Ma configuration Jest dans 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
  }
}

Fichier de configuration My 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()
);

Voici mon test simple:

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

Quelqu'un at-il une idée de pourquoi cela prend plus de 9 secondes? enter image description here

36
Tucker

J'utilise également Jest sur mon Angular et je ne suis pas sûr que ce soit une bonne solution.

Lorsque vous configurez votre module de test, vous pouvez utiliser NO_ERRORS_SCHEMA et vous n'avez pas besoin d'ajouter tous les composants imbriqués dans declarations pour compiler le composant que vous souhaitez tester.

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

Vos tests avec Jest sont des tests unitaires, donc avec cette solution, vous ne testerez que votre composant. Si vous souhaitez tester l'interaction entre les composants, vous effectuerez des tests de bout en bout avec Protractor ou Puppeteer.

2
Michael Werner

Je pense que la réponse devra finalement provenir de l'équipe Angular. La documentation de platformBrowserDynamicTesting est rare ( https://angular.io/api/platform-browser-dynamic/ testing/platformBrowserDynamicTesting ).

PlatformBrowserDynamicTesting émule peut-être un navigateur et charge l'intégralité du DOM pour votre application en mémoire. Dans ce cas, une accélération de près de 10 secondes pour une Angular (sans JavaScript mis en cache) semble raisonnable. Peut-être que j'interprète mal, mais d'après vos rapports, cela ressemble au test réel s'exécute en 6 millisecondes, ce qui semble répondre à votre exigence de "test rapide". Je serais curieux de voir combien de temps les tests prennent si vous ajoutez un autre test simple "devrait être rapide 2". Si le total est toujours en moins de 10 secondes, cela suggère que vos tests réels prennent très peu de temps par rapport à la montée en puissance de l'utilitaire Angular platformBrowserDynamicTesting.

2
phil