MVC / MVPアーキテクチャでwin フォームを使用すると、通常はクラスを使用してビューをラップし、モデルとコントローラー/プレゼンターのモックを使用して UI をテストします。ラッパー クラスは、UI のほとんどすべてを、プロパティとイベントを通じてテスト ランナーの監視可能なプロパティにします。
これは、WPF アプリをテストするための実行可能なアプローチでしょうか? より良い方法はありますか?注意すべき落とし穴はありますか?
テスト自体に関しては、おそらくUI オートメーションフレームワークを使用するのが最善でしょう。または、より流暢で wpf/winforms/win32/swt に依存しないフレームワークの使用方法が必要な場合は、Codeplex からWhiteをダウンロードできます (環境でオープン ソース コードを使用できる場合)。
落とし穴のために; ビューをテストしようとしている場合、おそらくいくつかのスレッドの問題に遭遇するでしょう。たとえば、NUnit を実行している場合、デフォルトのテストランナーは MTA (マルチスレッド アパートメント) で実行されますが、WPF は STA (シングルスレッド アパートメント) として実行する必要があります。Mike Twoは、WPF の単体テストを非常に簡単に開始できますが、スレッドの問題は考慮していません。Josh Smith は、この投稿でスレッド化の問題についていくつかの考えを述べており、 Chris Hedgate によるこの記事も指摘しています。Chris は、Peter Provost のCrossThreadTestRunnerの修正版を使用して、MTA/STA の問題をもう少し友好的な方法でラップします。
2016 更新:無料の TestStack.White フレームワークを使用して WPF UI テストを自動化する
WPF アプリを起動し、ボタンをクリックして結果を確認する例は、次のようになります。
using TestStack.White;
using TestStack.White.UIItems;
using TestStack.White.Factory;
[TestMethod]
public void TestDoSomething()
{
//Opens the app
var app = Application.Launch("MyApp.exe");
//Finds the main window (this and above line should be in [TestInitialize])
var window = app.GetWindow("My App Window Title", InitializeOption.NoCache);
//Finds the button (see other Get...() methods for options)
var btnMyButton = window.Get<Button>("btnMyButtonWPFname");
//Simulate clicking
btnMyButton.Click();
//Gets the result text box
//Note: TextBox/Button is in TestStack.White.UIItems namespace
var txtMyTextBox = window.Get<TextBox>("txtMyTextBox");
//Check for the result
Assert.IsTrue(txtMyTextBox.Text == "my expected result");
//Close the main window and the app (preferably in [TestCleanup])
app.Close();
}
@マットデビッド、
ドキュメントを読み、Microsoft CompositeWPF (別名 Prism) のコード サンプルを見てください。これは、テスト駆動型の方法で MVP/MVC アーキテクチャを処理する方法を教えるために特別に作成されたプロジェクトです。彼らのサンプル アプリケーションには、プレゼンター/コントローラーの単体テストと、UI の非常に優れた受け入れテストが含まれています (ユーザー アクションをシミュレートするためにWhite フレームワークを使用しています)。
手動で。私は、自動化されたUI テストの大ファンではありません。WPFのガイダンスについてはよくわかりません(akuのリンクを読む必要があります).. いわばまだ固まっているためです... WPFは「正しい方法は何か」という点から安定していません。これらの進化するフレームワークのいずれかを使用していない限り..私は保守的な努力をします
PS:これ (Mary Poppendieck の Google Talk on Lean) をご覧になることをお勧めします。特に、テストで何を自動化するかについての部分です。
uiテストを簡単に自動化するには、TestAutomationFXもお勧めします。TestAutomationFXを使用すると、wpf用のnetAdvantageツールを使用できますが、白とQTPでは機能しません。TestAutomationFXは使いやすいインターフェイスを備えており、Visual Studioと統合され、ユーザーイベントを記録するための優れたレコーダーを備えています。
WPF オートメーション用に Ranorex V2.0 をお試しください。RanoreXPath と Ranorex リポジトリを使用すると、テスト自動化コードを識別情報から完全に分離できます。Ranorex は、RanoreXPath オブジェクトに基づくキャプチャ/リプレイ エディターも提供します。
間違いなく TestAutomationFX.com を見てください。ホワイトでイベントをキャプチャ/記録しようとすると、多くの時間を投資できます(OK、私はしました)。(私の探求の開始時に、私はそれを参照する他の場所での投稿または2つを無視しました).
もちろん、UI テストではない最適なタイプのテストについては、他の点にも賛成です。
しかし、他のタイプのテスト カバレッジの欠点を回避するために、UI で自動化可能な何かを行う場合、TAFX が最も迅速な方法のようです。