Meteorでフルアプリテスト
Meteor 1.3からアプリのテストもサポートされました。チュートリアルにもとても簡単なものが紹介されています。Meteor 1.3 React日本語チュートリアル (step11)にあるものです。
Meteorの公式ブログでフルアプリテストに関する記事があったので紹介します。
Meteorはフルスタックフレームワークであるため、フルアプリテストという特徴的なスタイルになります。
フルスタックフレームワークであるMeteor
Meteorのフレームワークはフルスタックです。すなわち、MeteorのJavaScriptコードはクライアント(Webブラウザやモバイルアプリ)とサーバ(node.js)の両方で動作します。そのため、他のフルスタックでないフレームワークでは存在しなかったテストに関する挑戦と機会があります。
挑戦は、クライアントとサーバの両方合わせてテストしなければならないコードが分割されていることです。おそらく、アプリにはパブリケーションとメソッドが定義されていますが、ページで何からのアクションが起きメソッドが呼ばれた場合にパブリケーションが正しく動作し正しくページに反映されることを確認したいでしょう。もしくは、UI上でルーティングした場合に、新しいデータがサーバから送られてくることを確認したいかもしれません。
一方、他のフレームワークと比較して、Meteorはこの挑戦に対する機会があります。なぜなら、フルスタックですべてのコードをビルドしているためです。他のフレームワークでは、サーバ側のメソッドとパブリケーションの連携がうまく行くことを確認するだけのところが、Meteorでは、サーバとクライアントの境界を越えて統合テストを実施することができます。
よくあるWebスタックのテストの構成:
Meteorのフルアプリテストの構成:
どのように動作するか
Meteorアプリをテストモードで開始すると特殊な”testing”というMeteorアプリが起動します。典型的には、ブラウザでアプリを開くことでテストを開始します。すると、クライアントテストはそのブラウザで実行され、サーバテストもサーバで実行されてブラウザにレポートが表示されます。
アプリを通常のテストモード(meteor test
)で起動すると、テストするアプリはテストファイルをクライアントとサーバの両方でロードしますが、普通にアプリを動かしたときにロードされるファイルはロードしません。これの意味することころは、テストファイルは必要なファイルのみをインポートでき、普通にアプリ動かしたときに用意されるメソッドやパブリケーションなどは使えないということです。
これは単体テストや簡単な統合テストに便利です。このモードはこれらのテストのために使います。
フルアプリテストモード
一方、フルアプリテストモード(meteor test --full-app
)で起動すると、アプリ全体が通常通りロードされ、その上でフルアプリテストが動きます。これにより、テストをアプリコンテキストで動作させることができ、ルーティングやメソッド呼び出しなどのアプリレベルのテストを行うことができます。
このように、フルアプリテストは通常の統合テストよりも受け入れテストに近いものになっています。最大のメリットは、フルアプリテストはクライアントとサーバのどのスタックにも入れることができることです。これにより、「ホワイトボックス」受け入れテストを書くことができます。これは、seleniumなどのwebdriverを使った「ブラックボックス」テストと比較して制限が少なくなります。
歴史
Meteorのフルアプリテストは新しいアイデアではありません。Velocityプロジェクトは同じようなことを実現し、多くの先進的な取り組みでこのテストのデザインを知らしめました。
また、Gagarinツール(Laikaプロジェクトの影響を受けて)は動作しているMeteorアプリにテストコードを注入することを実現しています。これはMeteorアプリの外で動く様々なツールを利用することを可能にします。
Meteor 1.3のリリースで新しいテストモードが導入され、Meteorのテストの未来はよりはっきりとしたでしょう。コミュニティによってMeteorアプリのテストをより簡単で高速ににするツールが開発されることを期待します。
感想
これまでもパッケージ毎に単体テストを書くことはできたため、アプリを(アプリ内)パッケージに分割して構築する方法をとっているケースもありました。Meteor 1.3ではモジュールも導入されたため、パッケージを分ける必要がなく、だいぶ手軽になったのではないかと思います。また、フルアプリテストも統合され分かりやすくなったのではないでしょうか。Velocityがなくなってしまうのは残念なことではありますが、アイデアは生きていると思うことにします。