Turnip (+ Capybara) によるテストのレポートを作成する gem "Turnip Formatter" "Gnawrnip"

Ruby の gem である [TurnipFormatter](https://github.com/gongo/turnip_formatter) と、そのアドオンとなる [Gnawrnip](https://github.com/gongo/gnawrnip) の紹介です。

## 経緯その1 (Turnip のレポートについて)

[Turnip](https://github.com/jnicklas/turnip) で記述されたテストを実行すると、当然成功とか失敗の結果が表示されるのですが、
その結果がわかりづらい。デフォルトでは RSpec の標準 Formatter を使うことになるので

```
Steps for a feature
  Evil
    the monster has an alignment -> that alignment should be "Evil"
  Neutral
    the monster has an alignment -> that alignment should be "Neutral"

  Red Dragons are deadly
    there is a dragon -> there is a knight -> the dragon attacks the knight -> the knight is alive
    there is a dragon -> the dragon breathes fire -> there is a knight -> the dragon attacks the knight -> the knight is dead
```

こういう風に表示されます。 ステップが `->` で連結され横長になった結果を見ても、
いまいちよくわからない。どのステップで失敗したのかわからない。

一応 backtrace も吐いてくれるので

```
     # examples/steps/steps.rb:14:in `block in <top (required)>'
     # ./lib/turnip/execute.rb:20:in `step'
     # ./lib/turnip/rspec.rb:44:in `run_step'
     # ./lib/turnip/rspec.rb:70:in `block (6 levels) in run'
     # ./lib/turnip/rspec.rb:69:in `each'
     # ./lib/turnip/rspec.rb:69:in `block (5 levels) in run'
     # ./examples/errors.feature:8:in `it should die'
```

これでどうにか判断していくことになると思います。でも悲しい。
[Cucumber](https://github.com/cucumber/cucumber) には [こんな綺麗に表示してくれるプラグイン](https://github.com/masterthought/cucumber-reporting) があるのに。Turnip にも欲しい。

というわけで作ってみました。

## Turnip Formatter

https://github.com/gongo/turnip_formatter

Turnip Formatter は RSpec の Custom Formatter で、名前の通り turnip のテストレポート専用となります。

使い方や出力されるファイルは

* https://github.com/gongo/turnip_formatter/blob/master/README.md
* https://github.com/gongo/turnip_formatter/tree/master/example/README.md

を見れば雰囲気伝わるのではないかと思います。
cucumber の report ほど綺麗にはできてないんですが、そこそこ見れるようにはなったかな、と思います。

## 経緯その2 (Turnip と Capybara を組み合せている場合)

わたしは仕事で turnip を使っており、特に Capybara と組み合わせての
Web アプリケーションテストを行っています。先述の Turnip Formatter のおかげで
そこそこレポートの見映えもよくなったのですが

1. 「なるほど、レポートによれば `step 次へ勧む` で `Failure: expected to find button "next"` と出ているな」
2. 「ということは next ボタンが画面に無かったから失敗したんだな」
3. 「……じゃあお前は **どんな画面を見てたんだよ** 」

という具合に「エラーが起こった瞬間の画面」を知りたくなりました。
一応、capybara (selenium webdriver) を手元で実行すると目の前でブラウザ起動するので、
その時は実際に目で確認できるのですが、例えば CI により深夜に1回テストが走って
そのレポートを朝出社して見てみたんだけど、結局夜中どういうことがあって落ちたのかわからない、という具合に
どうしても目で確認することが困難な状況があると思います。むしろそっちの方が多い

というわけで作ってみました。

## Gnawrnip

https://github.com/gongo/gnawrnip

Gnawrnip は Turnip Formatter の Addon という位置付けで、
Capybara のもつ `save_screenshot` という API を使って `find_button` や `click_link` など
画面の検証、操作のタイミングでブラウザのスクリーンショットを記録、
その後 Turnip Formatter で作られたレポートに記録した画像を貼りつけています。

とりあえず最新版 (0.2.2) ではこんな感じでスライドショーしてくれます https://github.com/gongo/gnawrnip/pull/11#issuecomment-28494766

## まとめ

まだまだどちらも修正の余地ありありだと思うんですが、それでもなんとか
開発チームのテスト・デバッグの作業効率に少しでも貢献できているんじゃないかなと信じています。

いろんな人に使ってもらって「こうした方がいい」「この情報が見たい」「デザインイケメンにしてやるよ」などなど
ありましたら issue なりなんなりに連絡をお願い致します。

一応はてなブログにもちょこちょこ書いてるので、何かの参考になれば…

* [RSpec Turnip Formatter - Thanks Driven Life](http://gongo.hatenablog.com/entry/2013/04/18/195639)
* [RSpec Turnip Formatter 0.1.0 リリース - Thanks Driven Life](http://gongo.hatenablog.com/entry/2013/05/08/000001)
* [Gnawrnip - Add-on for TurnipFormatter with Capybara - Thanks Driven Life](http://gongo.hatenablog.com/entry/2013/05/02/003604)
* [gnawrnip 更新しました - Thanks Driven Life](http://gongo.hatenablog.com/entry/2013/11/16/214755)