※ この記事は Tech KAYAC Advent Calendar 2016 14日目の記事になります
こんにちは、劇場版でガルパンにどハマりして映画なんて全然観ない人間だったのに気づいたらほぼ毎週立川や幕張新都心にガルパン劇場版観に行って気づいたらこの一年で50回以上観てたりしてTV版一挙オールナイトも観に行ったりして、果ては大洗に行ってクイズラリーとか参加して海鮮丼食べたりギネス飲んだりギネス飲んだお店にあんこう祭りでテンション上がって買ってしまったフィギュアを忘れてきたりしてる(これ書いてる時点でまだ預かってもらってる迷惑な)超絶にわかガルパンおじさんの瀬戸です。気づいたら会社の机の上もカオスになってきました。
ガルパンはいいぞ
テスト遅い問題
アプリ開発しているとテストは書くわけですが、開発が進み2年も運用しているとテストの数が増えてきて当然のことながら少しずつテストの時間が延びていきます。 今関わっているプロジェクトでは最近は一回のフルテストで 18分 ぐらい掛かっています。一回のテストで 20分 近い時間がかかるとリポジトリへの push で自動テストをしたりすると簡単に渋滞してしまうので自動テストする対象は絞ってたりします。
自動テストの対象を絞ると部分的に自分でテストを走らせないといけないわけですが、そういうことをしているとたまにはテストしないままマージするようなことも発生したりするので、出来ればすべてのブランチを自動テストしたいのが正直なところです。
なのでそのためにもなるべく テストは速くしたい!
eupho
過去、自称穏健派の過激派による過激な対応によってテスト時間の改善が行われ、今も go-prove が使われているわけですが
(※詳しくは去年の Advent Calendar 記事参照)
それでも 18分 掛かっている現状に自分はこう思ったのでした。
( ˘⊖˘) 。o( go-prove が2台のサーバで動いて半分ずつテスト分担したら2倍速になるのでは? )
...
ということで誰でも思いつく非常に安直な発想のもと出来たのが eupho になります。
go-prove をサーバ・クライアントで動かすようにしたもので、だいたい以下のような動作をします
- サーバ: テストファイルのパスを列挙、クライアントにそれを配りきって全てのテスト結果を貰うまで待ち続ける
- クライアント: テストファイルのパスがもらえなくなるまで取りに行ってテストを実行しテスト結果をリクエストで通知する
絵にするとこんな感じでしょうか?
実際に動かしてみるとこんな感じになります
jenkins で実用するときは「euphoを起動するジョブ」と「eupho-slaveを起動するジョブ」に分けて用意して、「euphoを起動するジョブ」が走る時に「eupho-slaveを起動するジョブ」を curl で buildWithParameters 経由で起動するか Trigger/call builds on other projects
で起動するのが良いのかなと思います。このとき Build Blocker Plugin
を使って node level でのブロックを併用すると 1node に偏らないので良さそうです。
結果
eupho を使って18分掛かっていたテストを2台使って実行したところ10分で終わるようになったのを確認しました。
これが…
こうなって…
こうじゃ!
最高ですね!
slack に報告したところ…
ステマのごとく絶賛されてしまいました!コワイ!
まとめ
- 自動テストのことを考えるとテストは速い方が良い
- テスト遅い問題、テストを実行するサーバを複数に分散させるのはアリかもしれない
- もちろんスケールアップも1つの手
- まだ eupho を実戦投入してないけど動きそうな雰囲気なのでちゃんと使いたい
- 何がいいかは人それぞれですが、ワタクシ個人としましてはガルパンと響け!ユーフォニアムはいいぞ
明日は 飛鷹 君です!
こんな「〇〇はいいぞ」を書きたいだけの記事とは違う、素敵なお話をしてくれることでしょう!お楽しみに!