Tech Blog

グローバルな家族アプリFammを運営するTimers inc (タイマーズ) の公式Tech Blogです。弊社のエンジニアリングを支える記事を随時公開。エンジニア絶賛採用中!→ https://timers-inc.com/engineering

CircleCI のテストを並列化して実行時間を短くする

サーバーサイドエンジニアの鈴木です。

弊社では現在は CircleCI で PHP の自動テストを実行しています。例に漏れず、プロダクトの成長に従ってテストケースが増えてきており、自動テストの実行時間が長くなる問題が出てきました。そこで、CircleCI の並列化機能を使って並列化し、テストの実行時間を20%〜30%程度短縮することができましたので、その方法をご紹介します。

CircleCI の契約コンテナ数を増やす

まず並列化するには、契約しているコンテナ数が 2 つ以上必要です。1 コンテナあたり 50 ドル/月で増やすことができます。

config.yml を設定する

並列化は config.yml に記述することで設定することができます。

parallelism

実行したい並列数を指定します。下記の場合の並列数は 2 になります。

jobs:
    build:
        parallelism: 2

実行するテストファイルを各コンテナに割り当てる

並列化する場合、ファイル単位で分割したテストを並列化したコンテナにそれぞれに割り当て、同時に実行します。弊社ではテスティングフレームワークとして Codeception を使用しており、その仕様に合わせるためにテストファイルのパスを記述したファイルを各コンテナに配置する方法を採りました。

      - run:
          name: Split tests
          command: |
            TESTFILES=$(circleci tests glob "tests/**/*Test.php" | circleci tests split)
            echo $TESTFILES | tr ' ' '\n' > tests/_data/splitted_tests
  • circleci tests glob は条件にマッチするファイルのパスを一覧で返してくれるコマンドです。
  • circleci tests split は現在並列で稼働しているコンテナに自動で割り当ててくれるコマンドです。TESTFILES には割り当てられたファイルパスの一覧が入ります。
  • TESTFILES には半角スペース区切りでファイルパスが入るようです。Codeception では改行区切りでないと扱うことができないため、改行区切りに変換して特定のパスにファイルとして保存しておきます。

各コンテナで割り当てれたテストを実行する

まず事前に splitted_tests というグループ名を下記のように codeception.yml に定義します。

groups:
    splitted_tests: tests/_data/splitted_tests

Codeception では、-g オプションに続いてグループの名前を渡すと、そのグループに分類されたテストを実行することができます。各コンテナには自分が実行を担当することになるファイルの一覧が記述された splitted_tests が置かれていますので、同じコマンドでも別々のテストを並列で実行できることになります。

      - run:
          name: Run tests
          command: |
            php codecept run unit -g splitted_tests

並列化の手順は以上です。

まとめ

今回の方法では、ミドルウェアのセットアップといったテスト環境の準備の工程には手を入れずに、テストを実行する工程だけを並列化することができます。また、コンテナの契約数さえ確保できれば、前述の parallelism の値を増やすだけで並列数を増やすことができるので、スケーラビリティも高くすることができました。

積極採用中!!

子育て家族アプリFamm、カップル専用アプリPairyを運営するTimers inc. では、現在エンジニアを積極採用中! 急成長中のサービスの技術の話を少しでも聞いてみたい方、スタートアップで働きたい方など、是非お気軽にご連絡ください! 採用HP : http://timers-inc.com/engineerings

Timersでは各職種を積極採用中!

急成長スタートアップで、最高のものづくりをしよう。

募集の詳細をみる