railsでtest-queueを利用してcucumberを並列に実行する

はじめに

試験とは得てして時間が掛かるものだと思います。私が過去に経験した最も時間の掛かる試験は、一通り流すだけで三日くらい掛かる、本当にどうしようもないものでございました。しかも試験が通らないとCIの関係からデプロイできないという仕様でした。

こうしたヘビー級の試験を少しでも早くしようという試みが、試験の並列化です。

test-queueはそうした試験の並列化のためのgemの一つでございます。

試験を並列化するためのgemは他にも幾つかあります。ただ、どれも実際に現場で利用しみると、少なくとも対象がcucumberである時点で、性能はほとんど変わりません。どのgemも単一のfeatureファイルに記述された試験を複数のworkerに分割して実行できないからです。

試験ポリシー及びfeaturesの設計指針から、特定のfeatureファイルが突出して肥大化するのはよくあることです。改善のためには、それら設計を根本から見直す必要があったりして、意外と修繕に手間が掛かります。また、試験コードのリファクタリングは、上も投資判断が鈍るものです。

それでも最善を得る為、試験が均等に複数のfeatureファイルに分散している場合を考慮して、test-queueが有利である可能性が比較的高いと判断いたしました。そういったケースに備えて、parallel-testではなくtest-queueをチョイスするのは賢い選択だと信じております。

featuresの設計、強いては試験ポリシーの設計の大切さが身にしみます。

なによりも大切なのは、parallel-testをtest-queueに変更する行為ではなく、より読みやすく扱いやすい、それでいて必要最低限の試験だと強く思います。試験の負債ほど恐ろしいものはありません。気づかぬ間に時間が奪われていきます。

実装

必要なインストール作業はgemのインストールのみです。

$ gem install test-queue

そして、実行は以下の通りです。

$ bundle exec cucumber-queue features/

これだけで複数のworkerがCPUの数だけforkされて、並列に実行されることになります。実際にCPUの数だけworkerが走っている様子を確認すると、自分は何も大したことはしていないのに、妙な全能感に浸ることのできるgemでございます。

最高ですね。こういうの大好きです。

Rails

Posted by poison