TL; DR
- Cucumber で rerun した結果も含めて一つの結果として出力したい。
- HTML出力は一回の実行しか出力してくれないので、1回 rerun すると最初の結果と含めて二つのファイルに分割されて出力される。
- あと、HTML出力のデザインがなんか芋い。
- JSON出力したデータを加工してWEBで見れるようにしたらいいのでは?
- Railsの勉強もしたいし、Rails経由で表示しよう。
- なんだかんだでRailsでやる意味がないのでは?ということに気づく。
- 一週間無駄にした!記事にしないとやってらんない!!
事の発端
仕事でCucumberを使ってテスト自動化的なものをやっているわけですが、テスト結果をHTMLで出力して保存していってます。これがくせ者でして(というか私のシステムの組み方が悪いんでしょうけど)、HTML出力毎にJSとCSSを一つのファイルに組み込んで出力します。私の環境では、FeatureファイルごとにHTMLを出力するようにしていて、数百キロのファイルが1回のCucumberの実行で数十個出来上がります。毎日実行してたら、HDDを圧迫して仕方ない。
かつ、Cucumber の rerun 機能を使って、失敗したテストケースを最大で5回繰り返すということを行っているので、1 Feature につき最大で5ファイル作成されてしまいます。
こうなると、結果も煩雑になりますし、一回の実行で出力されるデータ量も相当なものになります。
解決策1
世の中には、JenkinsというCIサーバーがあります。そして、Cucumberの実行を助けるプラグインというもの存在しているようです。ただ、Jenkinsを使うまでのテストでもないしなぁというので、今回は見送りました。
解決策2
Cucumberは様々なフォーマットで出力できます。HTMLだったり、プレーンテキストだったり。その中でJSONがあり、JSONなら余計なデータがないのでデータサイズが小さくて済みそうだなぁということで、JSONを整形していて見やすい形で表示できないかなぁと思って、RailsでJSON受けて、DBに入れて、それをWEBで表示する方法がいいのでは?ということで実行することに。
DBむずい、まずは、JSONパースしてHashでデータとってRailsで表示すればいいか?
つーこって 127.0.0.1:3000/result にアクセスするとコントローラ内部でxquote使ってcucumberを実行して、その結果を文字列として取得。JOSNパーサでハッシュ化して、それをViewに渡して表示。って感じで表示した。
一番時間かかったのはCSSだったというのはRailsあるあるなんだろうか。。。
よし、JSONデータでの実装はできた。これをDBに落とすようにすれば完成だ。。。
と思って、どうDBに落とすかなぁというところで、indexページにボタン配置して、ボタンを押すとCucumberが動いて終了したらcurl使ってrailsにPOSTするって方法を考えて実行したんだけど、待てど暮らせどボタンを押してから帰ってこない。
まぁ、理由はRailsから外部プログラムを実行してその中でRailsにポストしてたから。外部プログラムはRailsの処理の完了を待つし、Railsは外部プログラムの完了を待つという、ある意味デッドロックの状態に陥ってた。
非同期処理をせねば!!
そこで登場 sidekiq。Railsは外部プログラムの実行をsidekiqに任せることで外部プログラムの処理を待たずして次の処理に進むことができる。外部プログラムもsidekiqごしにRailsにアクセスするので、通常のRailsのPOST処理が実行できる。
sidekiqの使い方はここを参考にした。
機構はできた。さぁDB設計だ。。。
ということで、JSONのデータをDBに落とし込むためのDBを定義しようと思って、ふと考える。
JSONはCucumberの実行単位でPOSTされる。ということは、それが一回目の実行なのか、二回目の実行なのかをデータで持つ必要がある。もっと言うと、rerunした結果なのかも知る必要が出てくる。。。むむ。。なんだかややこしいぞ?
Cucumber の Formatter 書いた方が早くね?
ここまでやって、結構肥大化してきたなぁという実感が湧き始め、CucumberのFormatterをJSONじゃなくて、新しいHTMLフォーマットで作成してそれを保存するような方法の方がいいじゃないか?と思って、モチベがなくなりました。なんだか、陶芸家がお皿を割る気持ちが少しわかったきがする。
今後の展望
CucumberのFormatterを作ってみようと思います。もしかしたら、やっぱりRails使ったほいがいいや!!ってなるかもしれません。そうなって、なおかつ完成したらまた記事にしますね。