search
LoginSignup
3

More than 3 years have passed since last update.

CircleCI でテストを並列に分割する

はじめに

テストを追加していくとテストの実行時間がボトルネックになりがちです。
そこで CircleCI ではテストを分割し、parallelism というキーを指定して並列実行ができるようになっています。
ここでは Node.js のプロジェクトで Jest を使用したものを例に話を進めます。

環境

CircleCI 2.1

CircleCI の設定

ジョブの並列レベルの設定

通常 CircleCI のジョブは config.yml に設定した処理を 1 つの Executor 上でジョブが動作します。
複数のジョブを並列に動作させたい場合は、parallelism というキーに並列数を 1 以上で設定します。
ここでは 2 を指定しているので並列数 2 で動作します。

.circleci/config.yml
version: 2.1
jobs:
  test:
    docker:
      - image: circleci/node:12
    parallelism: 2

ジョブの並列レベルの設定

並列数を増やしただけでは並列にジョブが動作するだけで、テスト時に同じテストファイルが実行されてしまいます。
次の設定を追加してテストファイルを分割することで分割されたテストファイルが並列に実行されます。
まず circleci tests glob コマンドにテストファイルのパスを渡します。
glob に使えるパターンはドキュメントを参照してください。
ここでは JavaScript と TypeScript が同居するプロジェクトを想定し、jsts を指定しています。
取得したファイルを分割するにはパイプで circleci tests split コマンドに渡します。
--split-by オプションには filesizetimings を指定できます。
今回は timings を指定します。
timings は、別途 store_test_results キーを使用することで適切なタイミングデータが生成されます。
store_test_results キーを使用した記事についてはこちらを参照してください。
split コマンドで実行した結果を環境変数に保存してからテストコマンドに渡すことで、テストが並列に分割された状態で実行されます。
DB などに依存するテストの場合でも並列に実行されるためデータが競合することはありません。

.circleci/config.yml
version: 2.1
jobs:
  test:
    docker:
      - image: circleci/node:12
    parallelism: 2
    steps:
      - run:
          command: |
            TESTFILES=$(circleci tests glob "__test__/**/*.spec.{js,ts}" | circleci tests split --split-by=timings)
            npm test $TESTFILES

さいごに

簡単ですが、CircleCI の並列分割テストについて取り上げました。
parallelism と CircleCI が用意した分割コマンドを実行することで簡単に並列実行できるのは便利だと感じます。

参考

Running Tests in Parallel - CircleCI

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
3