2011-10-18 26 views
1

私は、VB.netの他の開発者によって設計され書かれたかなり複雑なシステムに単体テストを改造しています。私はを試して、NUnitとNUnitフォーム拡張を使ってGUIフォームの単体テストを開発しようとしています。 (私は解決策があれば移植するのはかなり簡単ですが、NUnitクラスを使用している限りVB構文を知らないC#の例を見てきました)VB.net NUnit(2.5)Windowsフォームテスト - これは可能です

私は何をしているのですか最初にプログラムの簡単な説明。基本的にサーバーの動作を監視します。 IPとポートのフィールドを持つモーダルフォームを使用してサーバーに接続する必要があります。サーバーに接続すると、プログラムの他の部分がロック解除され、使用可能になります(サーバーの構成など)。

所望のプロセス:ロードプログラム>>モーダルログイン状態に>メインフォームの更新を接続するには、[OK]をクリックします> [詳細を入力>フォームの負荷を接続する接続ボタンをクリックしてください>他の機能

問題は、私がテストすることができないということです接続フォームの機能、およびプログラムのログイン機能を使用します。私はそれがロードモーダル接続フォームを正しくテストすることができます。詳細を入力して[OK]をクリックします(これまでのところすべて正常です)が、プログラムを論理的に進めるようには見えません。モーダルフォームは、プログラムのバックエンドから接続コードを実行しなくても一見閉じることができます。メインメニューに戻り、何もログインしていません。

私は本当に明白な何かを見逃してしまった、あるいは単にNUnitで実行できないと感じています。私は類似のものを探すためにインターネットを罠に掛けましたが、最も近いものは本当に一般的な別のSOスレッドでした。実際にログインしたバージョンのプログラムをテストすることができなくても、大きな障害になっています。 別の問題は、一意の識別子を持たないメッセージボックスを処理することです(「終了してもよろしいですか?これらはまた、NUnitのお尻の大きな痛みのように思えます

(何か違いがあれば、スタンドアロンプ​​ロジェクトとして、ビルドされたプロジェクトの実行可能ファイルへの参照を使用してテストを実行しています。実際のソース)

必要に応じてテストコードの一部を掲載することができます。

答えて

0

NUnitフォームについてはわかりませんが、White library(NUnitでも動作します)を使用すると、exeを実行してユーザアクションを模倣してアプリケーションをテストできます。アプリケーションは正常に実行され、すべてのアプリケーションロジックが実行されます。

mainForm.MenuBar.MenuItem("Edit", "Jobs...").Click() 
:なメニュー項目をクリックすると、アクションを実行する

Dim mainForm = app.GetWindow(SearchCriteria.ByAutomationId("MainForm"), 
          InitializeOption.NoCache) 

Dim app = White.Core.Application.Launch("MyApp.exe") 

あなたのアプリからフォームへのアクセス:ここ

はホワイトとアプリを起動するためのいくつかのサンプルコードです

コントロールの取得と状態の検証:

Dim someTextBox = mainForm.Get(Of TextBox)(SearchCriteria.ByAutomationId("txtValue")) 
Assert.IsTrue(someTextBox.Text = "12345") 

NUnitフォームにも同様の機能があるかどうかはわかりませんが、そうでない場合はWhiteを調べてください。私はそれを設定するいくつかの問題に遭遇しましたので、設定する前にドキュメントを慎重に読んでください(あいにく網羅的ではありません)。

+0

ありがとう、私はこれを調べます。 – AlistairC

2

IMHO単体テストでGUIクラスを実行する最良の方法は、Model-View-Presenter patternを適用し、フォーム(= View)クラスのほとんどのプログラムロジックを別のPresenterクラスに適用することです。次に、 "NUnitフォーム"のようなツールを必要とせずに、Presenterクラスを単体テストできます。

C++の例としてMichael Feathers' article "The Humble Dialog Box"を読むと、Winformsに簡単に適用できます。

+0

ご連絡ありがとうございました。それは興味深い記事であり、残念なことに非常に便利でした。システム全体を記録する必要はありません(私は唯一のジュニア開発者です)。私が望むのは、この冷凍庫の単体テストを途中でテストすることです。 – AlistairC

+1

ダイアログクラスを2に分割することは、 "システム全体を記録する"こととはまったく異なります(> 20000行のコードを持つダイアログが表示されている場合はOK)。あなたのダイアログのためにこれを行うためにどれくらいの時間が必要か、GUIを使ってこの揮発性で、ひどく動作している「ユニットテスト」アプローチと戦うためにどれくらいの時間を投資するか考えてみてください。 –

+0

@DocBrown:UIテストは揮発性で悪い作業である必要はありません(コード再利用のような優れたコーディング原則はUIテストにも適用する必要があります)。また、レガシーアプリケーションを使って作業するときは、コードをリファクタリングして何かを壊す危険を冒す前に、何らかの形のテストをしたいと思っています。 –

関連する問題