Webサービスの自動テストをどう行うか?

RailsやNode.jsを利用したWebサービスの自動テストをどのように行うかの現状の調査分まとめ。
随時更新。

Webサービスのテスト対象

  • [クライアントアプリ]
    • Android/iPadなどのWebサービスを利用するアプリ。クライアントアプリがブラウザの場合はアプリ自体はテストしない。
  • サーバアプリ
    • サーバサイド実装部分(RailsやNode.jsを使って実装)
      • Model
        • 最近だとtower.jsなどにように、クライアントのModelと共通の場合がある
      • View
        • 最近だとtower.jsなどのように、サーバではほとんどviewがない場合がある
      • Controller
    • クライアントアプリで動くJavaScript部分
      • Model
        • 比較的テストがしやすい
      • View/Controller
        • テストが結構手間。UIのテストは基本的に面倒。
  • サーバのデプロイツール
  • サーバのインフラ構築ツール
    • chefレシピ

テストの粒度とテスト手法

  • サーバ内、クライアント内で閉じるテスト
    • クライアントアプリ
      • (?、TODO: 要調査)
    • サーバサイド実装部分
      • Railsの場合
        • RSpecを使う
        • Jenkins連携: ci_reporterによりJUnit形式で結果を出力
      • Node.jsの場合
        • Jasmine-nodeやMochaを使う
        • Jenkins連携: jasmine-nodeがJUnit形式で結果を出力
    • クライアントアプリで動くJavaScript部分
      • QUnitやJasmineやMochaを使う
      • Jenkins連携: jasmineのreporterを変更してphantomjsで実行してJUnit形式で結果を出力
  • サーバとクライアントが連携する結合テスト
    • クライアントアプリがブラウザの場合
      • qunitやjasmineを使ってテストケースを作り、ブラウザから実行する
      • Jenkins連携: (TODO: 記載。jasmineで出力可能。qunitもできそうだがまだ試してない)
    • クライアントアプリがブラウザでない場合
      • (?、TODO: 要調査)
      • Jenkins連携: (?、TODO: 要調査)
  • 機能テスト
    • サーバサイドがRailsの場合
      • RSpecからCapybaraを使う。CapybaraのドライバはPhantomjsかSelenium2(WebDriver)を使う
      • Jenkins連携: RSpec + ci_reporterによりがJUnit形式で結果を出力
    • サーバサイドがNode.jsの場合
      • phantomjsやselenium(capybaraラッパーを含む)を使って、Jasmine-nodeで書いたテストを実行する。
      • Jenkins連携: jasmine-nodeのjunit結果出力を利用

capystranoのスクリプト&chefレシピのテスト

まだ未経験だが、下記が良さそう。

vagrantでec2インスタンス作ってcookしてからserverspecでテスト。
更にcapystranoでデプロイしてこちらもserverspecでテスト。