Re: JavaScript Test Code Coverage in Rails

JavaScript Test Code Coverage in Rails への一方的な返信記事です。

jscov を使うといいよ。


だけじゃアレなのでもう少し詳しく。

くだんの記事は、タイトルの通り Rails のテストで JavaScript コードのカバレッジもとろうぜという内容です。JavaScript のカバレッジ計測には istanbul を使っていて、それと rspec, capybara, selenium などと組み合わせることによるカバレッジの収集方法を紹介しています。無事にカバレッジの収集に至り、サンプルプロジェクトも公開されています。素晴らしい。

無事にできたね、チャンチャン、といきたいところなんだけど、ひとつ大きな落とし穴があります。一つのテストの中で複数回の visitclick_link などによるページ遷移を行うと、カバレッジデータが消えてしまうのです。istanbul は window.__coverage__ にカバレッジデータを収集する仕組みなので、ページロードが挟まると当然ながらデータはクリアされてしまいます。

この問題に対する包括的な解決策は、記事内では触れられていません。曰く、エッジケースが多すぎるとのこと。まぁそうかもね。


で、冒頭で触れた jscov という gem です。この gem を使うとページ遷移にまつわる問題を解決できます。

jscov は Rack Middleware を内包しています。jscov の Rack Middleware を使うと、unload 時に window.__coverage__console.log に出力するという JavaScript コードをレスポンスの HTML にねじ込みます。 selenium では console.log の取得を明示的に行わない限りログをためていってくれます。なので、rspec の after などでページ遷移ごとに出力された console.log の内容を参照することで、一連の操作で生成されたカバレッジデータを収集して保存することができます。保存したカバレッジデータからのレポート出力には nyc を使います。

セットアップは面倒くさいですが、JavaScript コードのカバレッジも集めたいんだって向きには役立つツールになってるんじゃないかと思います。