見出し画像

CircleCI上の統合テストの実行時間を23分から8分に短縮した話

はじめに

こんにちは!株式会社POLでエンジニアをやっている @show_kanamaru です!

POLは「研究者の可能性を最大化するプラットフォームを創造する」をビジョンに、理系学生に特化した採用サービス、および研究開発者・技術者に特化した転職/採用サービスの2サービスを運営しています。

画像1

画像2

今回は統合テストの実行時間を短縮した話をしたいと思います!


課題

プロダクトの品質を担保するうえでテストコードは非常に重要ですよね。僕たちも単体テスト、統合テストを頑張って書いているのですが、テスト数が増えていくにつれ、テストの実行時間が長くなるという課題を抱えていました。

特に統合テストは毎回DBに繋いでテストをしていることもあり、実行時間がかなりかかっていました。
(改善前は23分47sもかかっていました。アニメ1話分見れちゃいますね)

画像3

今回はcircleCIの機能を使ってこの実行時間を短縮したいと思います!


※前回フロントエンドのテストの実行時間を短縮した話はこちらから!


改善方法

今回circleCIのテストの並列実行の機能を使って実行時間を短縮していきます!(ドキュメントはこちら

前回のフロントエンドのテストの実行時間短縮では、モジュールごとにテストを並列化しましたが、違いは何なのでしょうか?
一番は「並列実行環境ごとに均等にテストが分配されるので実行環境ごとの偏りが出にくいこと」

どういうことかと言うと、例えばA、B、Cという3つのテストがあったときにそれぞれの実行時間がA: 10秒、B: 5秒、C: 3秒だとします。
これを2つにExecutorに分散させ並列にテストを実行するとしたときに以下のようなパターンがあると思います。

パターン1
Executor1: [A, B]
Executor2: [C]

パターン2
Executor1: [A]
Executor2: [B, C]

どちらのパターンがいいでしょうか?
当たり前ですが、パターン1は合計15秒、パターン2は合計10秒でテストが完了するので、パターン2のほうがいいですよね!
circleciでは簡単なオプションを設定するだけで、このように最適にテストを分割してくれます!

単純なモジュールごとの並列化では、1つのモジュールのテスト数が多いと、その分合計時間が長くなってしまうので、最適に並列化できるとは言えません。

実際に前回同様モジュールごとに並列化してみた結果がこちら

画像6

下から3つ目のテストだけ他と比べて時間がかかっていますよね。このようにテスト数によって偏りが出てしまうのがモジュールごとの並列化のデメリットでした。

なので今回はcircleciの機能を使い、4つのExecutorに分散させ並列にテストを実行し、--split-by=timingsというオプションを指定することで、並列実行コンテナ間で可能な限り均等に分割されるようにしました。(こちらのconfigを参考にしました)


実際の並列環境ごとに実行時間はこんな感じ

画像5

多少の誤差はあるものの、簡単な設定だけで並列環境ごとに均等にテストが分割されていることがわかると思います。

これにより、23分47sもかかっていた統合テストが7m36sに!

画像4

簡単な設定だけで約15分の短縮に成功しました!

そして、モジュールごとの並列化よりも2分ほど速く完了していることも確認できました!


おわりに

今回は統合テストの実行時間短縮についてまとめてみました!モジュールごとのテスト並列化に比べ、設定も簡単かつ最適に並列化してくれるということで、今後はこの機能を積極的に使っていきたいと思います!

そして、株式会社POLではエンジニア、デザイナー、プロダクトマネージャーを大募集してます!お話しだけでも構いませんのでお気軽にお声がけください!!!


この記事が気に入ったらサポートをしてみませんか?