web-dev-qa-db-ja.com

Jestでいくつかのテストを順番に実行する方法はありますか?

Jest はデフォルトでテストスイートを並行して実行しますが、フラグ(--runInBand)これにより、スイート全体を順番に実行できます(指摘 here

並行して実行できないいくつかのテストがありますが、スイート全体を順番に実行すると全体でかなり長い時間がかかるため、私の質問は、そのようにsomeテストのみを実行する方法があるかどうかです(これらのテストまたは同様のものにフラグを設定するなど)。

14
Mario F

私も同じ機能が必要でした。実行したいJest統合テストスイートの大規模なセットがあります。ただし、共有リソースのセットアップと破棄が必要なため、一部を並行して実行することはできません。だから、ここに私が思いついた解決策があります。

package.jsonスクリプトを以下から更新しました:

{
  ...
  "scripts": {
    ...
    "test": "npm run test:unit && npm run test:integration",
    "test:integration": "jest --config=__tests__/integration/jest.config.js",
    "test:unit": "jest --config=__tests__/unit/jest.config.js"
  },
  ...
}

{
  ...
  "scripts": {
    ...
    "test": "npm run test:unit && npm run test:integration",
    "test:integration": "npm run test:integration:sequential && npm run test:integration:parallel",
    "test:integration:parallel": "jest --config=__tests__/integration/jest.config.js",
    "test:integration:sequential": "jest --config=__tests__/integration/jest.config.js --runInBand",
    "test:unit": "jest --config=__tests__/unit/jest.config.js"
  },
  ...
}

次に、__tests__/integration/jest.config.jsを更新しました

module.exports = {
  // Note: rootDir is relative to the directory containing this file.
  rootDir: './src',
  setupFiles: [
    '../setup.js',
  ],
  testPathIgnorePatterns: [
    ...
  ],
};

const Path = require('path');

const { defaults } = require('jest-config');
const klawSync = require('klaw-sync')
const mm = require('micromatch');

// Note: rootDir is relative to the directory containing this file.
const rootDir = './src';
const { testMatch } = defaults;

// TODO: Add the paths to the test suites that need to be run
// sequentially to this array.
const sequentialTestPathMatchPatterns = [
  '<rootDir>/TestSuite1ToRunSequentially.spec.js',
  '<rootDir>/TestSuite2ToRunSequentially.spec.js',
  ...
];

const parallelTestPathIgnorePatterns = [
  ...
];

let testPathIgnorePatterns = [
  ...parallelTestPathIgnorePatterns,
  ...sequentialTestPathMatchPatterns,
];

const sequential = process.argv.includes('--runInBand');
if (sequential) {
  const absRootDir = Path.resolve(__dirname, rootDir);
  let filenames = klawSync(absRootDir, { nodir: true })
    .map(file => file.path)
    .map(file => file.replace(absRootDir, ''))
    .map(file => file.replace(/\\/g, '/'))
    .map(file => '<rootDir>' + file);
  filenames = mm(filenames, testMatch);
  testPathIgnorePatterns = mm.not(filenames, sequentialTestPathMatchPatterns);
}

module.exports = {
  rootDir,
  setupFiles: [
    '../setup.js',
  ],
  testMatch,
  testPathIgnorePatterns,
};

更新されたjest.config.jsは、jest-configklaw-sync、およびmicromatchに依存します。

npm install --save-dev jest-config klaw-sync micromatch

これで、順次実行する必要があるテストのみを実行する場合は、npm run test:integration:sequentialを実行できます。

または、並列テストの場合はnpm run test:integration:parallelを実行します。

または、npm run test:integrationを実行して、最初に順次テストを実行します。その後、それが完了すると、並列テストが実行されます。

または、npm run testを実行して、単体テストと統合テストの両方を実行します。

注:ユニットテストと統合テストで使用しているディレクトリ構造は次のとおりです。

__tests__
  integration
    src
      *.spec.js
      *.test.js
    jest.config.js
  unit
    src
      *.spec.js
      *.test.js
    jest.config.js
8
Danny Hurlburt

シリアルテストランナーを使用します。

npm install jest-serial-runner --save-dev

Jestをセットアップして使用します。 jest.config.js内:

module.exports = {
   ...,
   runner: 'jest-serial-runner'
};

プロジェクト機能を使用して、さまざまなテストにさまざまな構成を提供できます。

0
Joachim Lous