web-dev-qa-db-ja.com

GUIを単体テストするにはどうすればよいですか?

コードの計算は十分にテストされていますが、GUIコードが非常に多いため、全体的なコードカバレッジは思ったよりも低くなっています。ユニットテストGUIコードに関するガイドラインはありますか?それは理にかなっていますか?

たとえば、私のアプリにはグラフがあります。グラフのテストを自動化する方法を理解できていません。グラフが正しいかどうかを確認するには、人間の目AFAIKが必要です。

(私はJava Swing)を使用しています

148
Steve McLeod

MVPやMVCなどの設計では、通常、実際のGUIからできるだけ多くのロジックを抽象化しようとします。これに関する非常に人気のある記事の1つは、Michael Feathersによる "The Humble Dialog Box" です。個人的には、ロジックをUIから外そうとすることで、さまざまな経験がありました。非常にうまく機能することもあれば、価値がある以上に面倒なこともありました。ただし、私の専門分野の範囲外です。

67
Jon Skeet

もちろん、答えはMVCを使用して、できるだけ多くのロジックをGUIから移動することです。

そうは言っても、SGIがOpenGLを新しいハードウェアに移植しているときに、一連のプリミティブを画面に描画し、フレームバッファーのMD5合計を計算するユニットテストがあることを昔から同僚から聞きました。次に、この値を既知の良好なハッシュ値と比較して、APIがピクセルごとに正確かどうかをすばやく判断できます。

36
dicroce

試すことができます UISpec4J は、SwingベースのJavaアプリケーション用のオープンソースの機能および/または単体テストライブラリです...

10
CMS

Swing GUIアプリケーションの機能受け入れテストを英語で書くために Cucumber および Swinger を使用することができます。 Swingerは、NetbeansのJemmyライブラリをフードの下で使用してアプリを駆動します。

Cucumberを使用すると、次のようなテストを作成できます。

 Scenario: Dialog manipulation
    Given the frame "SwingSet" is visible
    When I click the menu "File/About"
    Then I should see the dialog "About Swing!"
    When I click the button "OK"
    Then I should not see the dialog "About Swing!"

これをご覧ください Swinger video demo 動作を確認してください。

7
Dema

テストは芸術形式です。ロジックをできるだけGUIから削除する必要があることに同意します。その後、ユニットテストに集中できます。他のテストと同様に、テストはリスクを軽減することに関するものです。常にすべてをテストする必要はありませんが、多くの場合、最善のことはさまざまな分野でさまざまなテストを分割することです。

もう1つの質問は、UIレイヤーで実際にテストしようとしていることです。 UIテストは、作成、保守に時間がかかり、最も脆弱であるため、最も高価なテストです。線を描く前に座標が正しいことを知るためにロジックをテストする場合、具体的に何をテストしますか?赤い線が描かれたグラフをテストする場合。あらかじめ決められた座標を設定して、特定のピクセルが赤かどうかをテストできますか?上記のビットマップ比較が機能するように、SeleniumはGUIをオーバーテストするのではなく、UIの作成に役立つロジックをテストし、UIのどの部分が壊れているか疑わしい部分に焦点を合わせて、いくつかのテストに焦点を当てることに焦点を当てますそこ。

6
Charles Smith

ここにいくつかのヒントがあります:

GUIからできる限り多くのコード(コントローラーとモデルオブジェクトを持っている)を削除して、GUIなしでテストできるようにしてください。

グラフィックについては、グラフィックを生成するコードに提供する値をテストする必要があります。

6

Selenium RC があり、WebベースのUIのテストを自動化します。アクションを記録して再生します。 UIとのやり取りを引き続き確認する必要があるため、これはカバレッジに役立ちませんが、自動ビルドに使用できます。

6
David Robbins

あなたの質問から私が収集するのは、GUIの動作を詳細にテストする自動化された方法を探しているということです。あなたが与える例は、曲線が実際に正しく描画されるかどうかをテストすることです。

ユニットテストフレームワークは自動化されたテストを行う方法を提供しますが、実行したいテストの種類は、GUIツールキット/ライブラリのクラスを含む多数のクラスの正しい動作を検証する複雑な統合テストだと思いますテストしたくないはずです。

オプションは、使用するプラットフォーム/ツールキット/フレームワークに大きく依存します。たとえば、GUIフレームワークとしてQtを使用するアプリケーションは、テストを自動化するためにSquishを使用できます。テストの結果を1回検証すると、後続の自動的に実行されるテストでは、結果と検証結果を比較します。

3
andreas buykx

JFCUnit を使用してGUIをテストできますが、グラフィックスはより挑戦的です。何度かGUIのスナップショットを撮り、それを以前のバージョンと自動的に比較しました。これは実際のテストを提供するものではありませんが、自動ビルドが期待される出力の生成に失敗した場合は警告を発します。

3
Steve Moyer

Window Licker SwingおよびAjaxの場合

2
robi-y

GUIライブラリをテストするのはあなたの仕事ではありません。そのため、実際に画面に描画されているものをチェックし、代わりにウィジェットのプロパティをチェックする責任を回避して、描画されたものを正確に表すライブラリを信頼することができます。

0
ivan_pozdeev

Swingを使用している場合、 FEST-Swing はGUIの駆動とアサーションのテストに役立ちます。 "ボタンAをクリックすると、ダイアログBが表示されるはずです"またはなどのテストが非常に簡単になります。 「ドロップダウンからオプション2を選択すると、すべてのチェックボックスが選択解除されるはずです」

あなたが言及したグラフのシナリオは、テストするのがそれほど簡単ではありません。 GUIコンポーネントを作成して表示するだけで、GUIコンポーネントのコードカバレッジを取得することは非常に簡単です(そして、おそらくFESTでそれらを駆動します)。ただし、意味のあるアサーションを作成するのは難しい部分です(そして、意味のあるアサーションのないコードカバレッジは、自己欺inの練習です)。グラフが上下逆に描かれたり、小さすぎたりしないことをどのようにテストしますか?

GUIの一部の側面は自動化された単体テストでは効果的にテストできないこと、および他の方法でテストする必要があることを受け入れる必要があると思います。

0
Dan Dyer

私が知っていることから、これは非常に複雑であり、実際には言語に依存します-多くの言語にはGUIをテストする独自の方法がありますが、GUIをテストする必要がある場合(モデル/ GUIの相互作用とは対照的に)、多くの場合実際のユーザーがボタンをクリックするのをシミュレートします。たとえば、Eclipseで使用されるSWTフレームワークでは、 SWTBotJFCUnit が既に説明されていますが、MozillaにはXULでこれをシミュレートする独自の方法があります(私が読んだものから)彼らのブログでは、これらのテストは非常に脆いようです)。

時々スクリーンショットを撮って、ピクセル完璧なレンダリングをテストする必要があります(Mozillaは正しくレンダリングされたページをチェックするためにこれを行うと信じています)-これにはより長いセットアップが必要ですが、グラフに必要なものかもしれません。そのようにして、コードを更新してテストが中断した場合、失敗が実際であるかどうかを手動で画像を確認するか、グラフのレンダリングコードを改善して、きれいなグラフを生成し、スクリーンショットを更新する必要があります。

0
Kim Sullivan