2009-03-23 11 views
5

ちょうど 'TDD'と 'GWT'のグーグル化はthis articleに簡単につながります。ここで著者はコンテナなしでGWTアプリケーションをテストする方法を説明しました。しかし、私は彼の例がすべてのデザインを最初に持っているのでテスト駆動ではないと思って、テストを最初に書くのではなく、その後に書きます。GWT開発をテストドライブするにはどうすればよいですか?

GWTのようなUIで「テストファースト」開発が可能ですか?一部の人々は、UIコードはTDDには適していないと言いました。しかし、私はMVCパターンを採用することで、おそらく少なくともMC部品をテストドライブできると思いますか? (Vはテスト駆動では開発できないUI部分です)。

記事例で最初に失敗したテストは何ですか?

答えて

14

テスト運転のUIは、画面上に表示するまで、画面上で何をしたいか分からないことが多いため、問題があります。そのため、GUIの開発は大規模な反復的な傾向があり、したがってテストを実行することは非常に困難です。

これは、GUI用にTDDを放棄したという意味ではありません。むしろ、GUIからできるだけ多くのコードをプッシュし、単純な配線コードだけを残しています。この配線によって、問題の本質に影響を与えることなく、私たちが必要とする大規模な反復的な変更を行うことができます。

このテクニックは、数年前にMichael Feathersが"The Humble Dialog Box"というタイトルの記事で最もよく説明したものです。 4年前にこのような騒動を引き起こしたのは、Model-View-Presenterパターンの背後にある基本的な考えです。パッシブビューと監督コントローラのパターンに分割されました。この質問の記事リンクは、これらのアイデアを活用していますが、テストドリブンな方法ではなく、テスト後のものです。

アイデアは、ビューを除くすべてのドライブをテストすることです。確かに、私たちは良い見通しを立てる必要はありません。確かに、このビューは非常に不条理に単純なので、単体テストのテストはまったく必要ありません。あるいはそうであれば、実際には最後に書かれます。

監視コントローラをテストするには、データが画面にどのように表示されるかを確認するだけです。データがどこにあるのか、フォントが何であるか、どのような色であるか、GUIの大規模な繰り返しを引き起こすその他の美容上の問題を知る必要はありません。むしろ、1つのデータ項目が何らかのテキストフィールドになることはわかっています。もう1つはメニューになり、もう1つはボタンまたはチェックボックスになります。そして、これらのアイテムを正しくレンダリングするためには、Viewが質問する必要があるすべての質問を要求できることを確認します。

たとえば、テキストボックスにデフォルト値が設定されている場合があります。ビューはそれを求めることができるはずです。メニューには、一部の項目がグレー表示されている場合があります。ビューはこの情報を要求できます。ビューが尋ねる質問はすべてプレゼンテーションに関するものであり、ビジネスルールはありません。

同様に、ビューは変更があったときに監督管理者に通知します。コントローラは、あらゆる種類の検証やエラー回復を含めて、データを適切に変更します。その後、Viewはデータの提示方法を尋ねることができます。

これはすべて視覚的な表示から切り離されているため、このすべてはテスト駆動にすることができます。すべてについてはのデータが操作されて表示され、ではなく、のようになります。したがって、大規模に反復する必要はありません。

3

私はGUIを使ってSwingとGWTアプリケーションの開発をテスト駆動することに成功しました。

「GUIのすぐ後ろ」でテストすると、モデルコードとGUIコンポーネントの統合が無視されます。モデルが変更され、GUIから入力を受け取り、モデルを更新するときに、アプリケーションはGUIのデータを表示するためにイベントハンドラを接続する必要があります。これらのイベントハンドラが正しく接続されているかどうかのテストは、手動で行うと非常に面倒です。

GUIでテストするときに克服すべき大きな問題は、開発中のGUIの変更にどのように対処するかということです。

GWTにはこれをサポートするフックがあります。 GWTウィジェットでデバッグIDを設定し、アプリケーションにDebugIDモジュールをインポートする必要があります。テストは、Webブラウザを制御し、IDで要素を見つけてクリックするか、テキストを入力することで、アプリケーションと対話できます。 Web Driverはこれを行うための非常に優れたAPIです。

しかしこれは始まりにすぎません。また、GUIの構造からテストを切り離す必要があります。つまり、ユーザーがUIをナビゲートして作業を完了させる方法です。これは、GUIを介してテストするか、GUIの後ろでコントローラをテストするかに関係なく行われます。コントローラに対してテストすると、コントローラはユーザがアプリケーションのさまざまなビューをナビゲートする方法を指示します。テストはコントローラに結合されているため、そのナビゲーション構造に結合されます。

この問題に対処するために、私たちのテストは "ドライバ"の階層を使ってアプリケーションを制御します。テストは、ログイン、注文の入力、支払いのようなユーザー中心の活動を実行できるようにするドライバーと対話します。ドライバは、GUIをナビゲートしてデータを入力することによって、これらのタスクの実行方法に関する知識を取得します。これは、ボタンのクリックや入力フィールドへのテキストの入力など、「ジェスチャー」によってナビゲーションやデータ入力がどのように行われるかをキャプチャする下位レベルのドライバを使用して行います。あなたは、階層のように終わる:

  • ユーザ目標:テストは、ユーザーがシステムとそれぞれの目標を達成できることを確認し、これらの目標は
  • ユーザアクティビティ...のシーケンスによって達成される方法を示していました:ユーザーがGUIを介して実行するもの、実行するドライバとして表されるもの...
  • ジェスチャー:GUIを制御するための低レベルのマウスとキーボード入力。

(この用語は、ユーザー中心の設計文献ではよく使われますが(用語は異なります)。

関連する問題