サーバーサイドエンジニアの鈴木です。
弊社では現在は 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