質問

ここではVisual Studio 2008でプロジェクトに取り組んでいます。それに付属する組み込みのテストスイート(Microsoft.VisualStudio.TestTools.UnitTesting名前空間)を使用しています。残念なことに、かなりの複雑さ(およびエラー)がUIレイヤーにコード化されてしまいました。私たちの単体テストはビジネス層をカバーするというまともな仕事をしていますが、UI層は常に刺激の源です。理想的には、同様に単体テストを行いたいと思います。誰もが優れた「Microsoft互換」を知っていますか?ビジュアルスタジオでそれを行う方法? nUnitForms などの単体テストフレームワークとMicrosoftのものを「ミックス」する何らかの競合を導入しますか?単体テストフォームで注意すべき明らかなクマのわなはありますか?

役に立ちましたか?

解決

UIを単体でテストする必要がないように、UIをリファクタリングする必要があります。 UIには、最小限のビジネスロジックを含めるか、ビジネスロジックを含めないでください。この問題に対処する多くのパターンがあります。 Martin Fowlerには、これらのパターンについて多くのことを説明した非常に良い記事があります: http://martinfowler.com/eaaDev/ uiArchs.html

テスト不能なUIのリファクタリングについて説明しているMartin Fowlerによるリファクタリングの本には小さな章があります。レガシーコードを効果的に使用することもできます。

注:UIテストの自動化に使用できるツールがあります。 SilkTestが思い浮かびます。ただし、可能な場合は使用しません。

他のヒント

これは、通常のアプリケーション単体テストにはすべてうまく機能しますが、コントロールの動作と状態の単体テストが必要なユーザーコントロールを構築する場合は、単体テストフレームワークも必要です。 NUnitFormsがあなたの答えかもしれません。個人的には自分で確認する必要があります。

ここで詳しく説明するパッシブビューアーキテクチャを使用します http://martinfowler.com/eaaDev/PassiveScreen。 html

基本的に、フォーム内のすべてのコードをxxxUIという別のクラスに移動します。次に、フォームはIxxxUIインターフェイスを実装し、xxxUIクラスが必要とするものをすべて公開します。おそらく、物事を単純化し、複数のコントロールの処理を1つのメソッドに集約することができます。

次にフローが進みます。ユーザーはボタンをクリックします。ボタンは、対応するUIクラスのメソッドを呼び出します。必要なパラメーターを渡します。 UIクラスメソッドは、モデルを変更します。次に、インターフェースを使用してUIを更新します。

ユニットテストでは、テストクラスまたはダミークラスでインターフェイスを実装し、UIクラスに登録します。これらのテストクラスに任意のタイプの入力を起動させ、それに応じて応答させることができます。通常、正確な順序で処理を行うシーケンスリストがあります。 (Aをタップし、これをクリックし、スクロールしてからBを入力するなど)。

ApprovalTests(www.approvaltests.comまたはnuget承認テスト)を使用してWinformをテストするのは非常に簡単で、Nunitと同様にMsTestと互換性があります。

その方法のビデオがあります: https://www.youtube.com/ watch?v = hKeKBjoSfJ8

しかし、プロセスは簡単です。 1)検証したい状態でテストするフォームを作成します。 2)WinFormApprovals.Verify(form)を呼び出します

ApprovalTestsは、ゴールデンマスターパラダイムを使用して、結果をスクリーンキャプチャします。必要に応じて、ファイルの名前を.approvedに変更するだけで、テストに合格します。

既存のコードをリファクタリングするためのこの素晴らしい点は、あなたがそれを変更していないことだけを心配しているので、結果が何であるかを心配する必要さえありません。

リファクタリングのインスピレーションについては、Jeremy D. MillerのWIP プレゼンテーションパターンWikiページをご覧ください。 )

Millerは本を書いていますが、この種のことの必需品になると思われます。

NUnitFormsを使用して、独自のUIコントロールをテストして良好な結果を得ることができました。標準(または十分にテストされた)UIコントロールを使用している場合、リファクタリングについて他の人に同意します。

実際のコントロールのテストに焦点を当てる場合は、新しいコントロールをサポートするために拡張できるため、NUnitFormsを使用します。とにかく、手動テストを行わない場合は、「イメージベース」を実行できるライブラリが必要になります。表示された最終結果の分析。

このためにTestCompleteを試しましたが、c#でのイメージ比較のために同様のライブラリをコーディングできるため、少し高価すぎると思います。したがって、私の計画は、コントロールを個別にテストし、他の人が述べたようにUIをリファクタリングすることです。

MicrosoftコードUIを使用してUIレイヤーをテストする必要があります。これには、ユーザーが実行するアクションを模倣するテストの作成(または記録)と、正しい出力が達成されることを保証するアサートステートメントの作成が含まれます。

もちろん、これは単体テストではなく議論の余地があります。単一の作業単位をテストするアクションをフロントエンドから作成するのは難しく、他の単体テストの代わりではないからです。また、フロントエンドのビジネスロジックはできるだけ薄くする必要があることに同意します。ただし、これにより、単体テストでカバーされないギャップが埋められます。コード化されたUIテストがテストされていない残りのユニットをキャッチできるように、ユニットテストでは小さな作業ユニットのみがカバーされないことを願っています。

コード化されたUIは、Visual Studio Premiumの最新バージョンに組み込まれています。レコード機能を使用するだけでなく、テストを自分で作成する方法を学習することをお勧めします。これにより、柔軟性が向上します。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top