C#とNUnitを使用してGUIアプリの単体テストを構成する方法


16

簡単なアプリケーションを顧客の1人に提供するために、小さなサイドプロジェクトを行うように依頼されました。通常、テストニーズをすべて把握しているバックエンドコードで作業しますが、GUIのテストを作成することについてまだ疑わしい喜びがありません。 EXEのテストコードとツール。

私の最初の本能は、テストをアプリケーションコードに単純に含めることでしたが、テスト固有の多数の依存関係を提供する必要があり、特に顧客に出荷しないように指示されました。また、専用のテストツール用に現金を絞り込めないため、手元にあるツール(StoryQRhinoMocks、およびNUnitを使用する必要があります。)、これは実際に単純なGUIアプリの動作をテストするのに十分なはずです。したがって、私が見る限り、これにより、デザインを本当にシンプルに保つか、テストのために意図的にオーバーエンジニアリングするかのバランスをとろうとしています。別のライブラリでビジネスロジックを使用してアプリを構築し、通常どおりにライブラリに対してテストするか、アプリケーション設計ではない追加のモジュールを壊さずに実行可能ファイルを許可する他のメカニズムを見つけているようです本当に必要。

編集:
この質問は、DLLとは対照的に、NUnitと実行可能ファイルの関係を構築する方法に関するものであり、プレゼンテーションとビジネスロジックを分離する方法に関するものではないことに注意してください。
/編集

だから私の質問は:

  1. 単純なGUIアプリケーションを単体テストで構成して、手元にあるツールを使用して、過剰なエンジニアリングに頼らずに状態と動作を適切にチェックできるようにする特定の/推奨の方法はありますか?
  2. (DLLではなく)EXEをテストするときにNUnitを起動/構成する方法に関する基本的なことを見逃していませんか?
  3. このすべてをどのように達成するかの例の方向性を提供または指示できますか?

これを行うには複数の方法があるかもしれないことを理解しているので、あなたの経験に基づいて特定の実装ガイドラインを探しています。


NUnitは、GUIを直接テストするようには設計されていません。ビューを使用せずにビューに入る内容をテストできるように、プレゼンテーションレイヤー(ビュー)をデータおよびビジネスロジック(モデル)から分離する必要があります。
バーナード

1
@Bernardこの質問は、テスト用のGUIの階層化に関するものではありません。些細なものも含め、私はすべてのアプリを自然に重ねているので、それは本当に私にとって問題ではありません。質問を適切に編集したので、誤解が解消されることを願っています。:)
S.ロビンス

1
EXEの単体テストでは、それほど複雑なことはありません。テストDLLにEXEファイルを参照させるだけで、準備完了です。
whatsisname

回答:


3

simoramanの答えに対するコメントの1つで、これを行うためのいくつかの方法を考えたと述べました。私のオプションの1つは、重複プロジェクトを作成してDLLを生成するというJalaynの回答の提案に似ていましたが、他のアイデアは、テストしたいコードがあるプロジェクトのファイルに単純にリンクすることでした。両方のオプションを機能させることもできますが、理想的とは言えません。

2番目のケースでは、依存関係を最小限に抑えるためにアーキテクチャを実際にいじることができない限り、管理するユニットの依存関係が大量にあります。これは小さなプロジェクトには適していますが、大きなプロジェクトは管理するのが面倒です。ただし、このオプションに対する私の最大の抵抗は、その非常に優雅さです。確かにできるそれを機能させますが、そうすることで、カプセル化を解除して、パブリックインターフェイス経由でテストするのではなく、ソース経由でアセンブリの内部を直接テストする必要があります。同様に、プロジェクトファイルを追加すると、一度に2つのプロジェクトで作業を複製するか、プロジェクトファイル設定を一度に2つのファイルに自動的に追加する方法を見つけるか、ビルドするたびにプロジェクトフィールドをコピーして名前を変更することを忘れないでください。これはおそらくビルドサーバー上で自動化できますが、IDEで管理するのは面倒です。繰り返しますが、それはうまくいくことができますが、それはせいぜい面倒であり、あなたがそれを間違えると厄介です。

最良の方法は、whatsisnameが私の質問にコメントしたときに実行し、テストプロジェクトの参照としてEXEを単に含めることです。この場合、EXEはDLLと同じように効果的に処理されることがわかり、すべての適切に階層化されたクラスにアクセスして、私のボートに浮かぶものをテストできます。


2

私は思う:

  • ビジネステストコードは、ビジネスコードライブラリをテストする別のプロジェクトに含める必要があります。
  • GUIテストコードは、GUIライブラリをテストする別のプロジェクトにある必要があります。さて、実行可能ファイルの代わりにGUIライブラリを構築する方法については、後で答えようとします。
  • my.namespace.biz.MyClassがある場合、テストクラスはmy.namespace.biz.MyClassTest(またはMyClassTestCase)である必要があります。
  • 実行可能ターゲットで見つかったコードをテストする場合は、EXEをビルドするセットアップと、テストを起動するライブラリ(DLL)をビルドする別のセットアップが必要です。

これらは、JavaであろうとC#であろうと、従うのが好きなルールです(もちろん、JavaにはEXE問題はありません:-))

テスト環境の構成方法については、少なくとも次の2つの選択肢があるように思えます。

MSBuildを使用する

.projファイルのクローンを作成します(たとえばmyproject-as-dll.proj)。OutputTypeクローンファイルのを「EXE」から「」に変更しますLibrary。MSBuildコマンドを使用して、NUnitテストケースを含むプロジェクトへの参照として設定できるライブラリを作成できるようになりました。

私には可能のように思えますが、私はそれをそれほど正直に使ったことがないので、よくわかりません。さらに、統合テストサーバーにMSBuildがない場合があり、Visual Studioから分離できるかどうかわかりません...

NAntを使用する

NAntに慣れていない場合は、NAntを使用してプロジェクトビルドを構成する方法をグーグルで調べる必要があります。たぶん、チェックアウトこれを、それは少し古いですが、著者はNAntのファイルをコメントしているし、もしを見つけることは自明(編集:より詳細に自分のファイルを調べて、私は非常に再利用可能な彼のコンフィギュレーション・ファイルを見つけます)。彼はまた、テストケースを実行し、コードカバレッジツールを起動するため、単なるビルド以上のことを行います。今、私はNAntを使用したことがないことを認めています.Javaの対応者であり父である「Ant」とは対照的に、私は多くを使用しましたが、それはまったく同じものであり、学ぶことはそれほど難しいとは思いません。

このツールを使用すると、次のことを可能にする構成を思いつくことができます。

  • すべてのプロジェクト(ビジネスロジック、GUIなど)を個別のライブラリにビルドします
  • テストプロジェクトを構築する
  • テストを開始します(特定の部分はNUnit2タスクで実行されます)。
  • NCoverタスクでコードカバレッジを調べます。

もう少しコードを追加すれば、次のこともできます。

  • 統合サーバーで夜間展開を実行します
  • 統合サーバーでNAntが使用可能な場合、スケジュールされたタスクの助けを借りて、夜間の統合テストを開始します

すべては、Visual Studioファイルを変更せずに行われます。そして、本当に、それは私にとって過剰なエンジニアリングのようには見えません、それはただ一つのファイルです。すべてが機能するまでに1〜2日かかる場合がありますが、私の意見では適切なセットアップができます。

最後に、プロジェクトの構築、テスト、実行に必要なすべてをクライアントに提供します。私はそれがあなたのプロフェッショナリズムとあなたが心の中で品質を持ってコードを書くという事実を示すと思う傾向があります(あなたはエレガントなソリューションを探しているのであなたはそうしているようです)


0

プロジェクトが(最初は)小さいからといって、適切なアーキテクチャが過剰に設計されているわけではありません。テストを書きたいという事実は、プロジェクトが完全に些細な一回限りのハックではないことを示しています。

使用しているGUIフレームワークについては言及しませんでした。WPF MVVM(Model-View-ViewModel)は優れており、すべてのロジックのテストを非常に簡単に作成できます。WinFormsを使用すると、MVP(Model-View-Presenter)について良いことを聞いたことがあります。


私が書いたすべてのコードのテストを書いています。些細なこともあります。テストを書かないのは、スパイクをするときだけです。この場合、私は一回限りのユーティリティを顧客に出荷しています。そのため、テストは単なる贅沢以上のものであり、品質基準を満たすための要件です。「オーバーエンジニアリング」に関しては、これは良いアーキテクチャか悪いアーキテクチャかの選択ではなく、アプリが比較的短いライフサイクルを持つ単一の目的であるため、このインスタンスでは不要な追加の階層化を課す必要性を回避します。
-S.ロビンス

guiフレームワークの選択に関する限り、これがテスト環境の設定方法にどのように影響するかはわかりません。私が利用できるツールを使用して、GUIレイヤーの単体テストを具体的に実装する方法を探しています。この特定の答えは、それについて私に何も教えてくれません。
-S.ロビンス

シモラマン-かなり批判的な最初の段落を取り上げた場合、これは答えになります。それを修正し、-1を削除します。@ S.Robinsは、2番目の段落関連していることに注意しています-完全な答えではありませんが、役立つでしょう。GUIレイヤーが薄く、よく構成されており、明白であり、すべてのビジネスロジックがモデルレベルで単体テストによってテストされている場合、UIを明示的にテストする余分な手間をかける必要がない場合があります。
マークブース

1
@MarkBoothの階層化は実際には問題ではありません。simiramanが述べているように、私はMVP、MVVMを実行できます。ただし、明示的なテストを必要とするGUI固有の要素がいくつかあるため、これを質問として作成することにしました。いくつかのアイデアがありますが、さらに悪化した場合は、最終的には自分で問題を解決し、答えを書くことができることを知っています。ただし、ProgrammersSEにとって良い質問になると思ったので、これをコミュニティに公開したかったのです。;-)
S.ロビンス

0

この質問に対する私の答えを見てください: Winformsソリューション用にMVPを設定するにはどうすればよいですか?

実際に、GUIを階層化する方法とテストする方法を示すサンプルアプリケーションを作成しました。

編集内容を読む:開発環境と統合するテストランナーを使用します。私はReSharperを使用しています。


ReSharperの推奨に感謝します。これは、開発時に使用するツールです。残念ながら、統合ビルドサーバーでテストを実行するときには役に立ちません。また、テスト時にexe内のコードにアクセスするようにNunitテストを構成する方法も教えてくれません。
-S.ロビンス

1
非公式に、そうです。exeは単なるビューであり、アプリケーションの起動の一部としてプレゼンター、モデル、およびビューモデルをクラスライブラリからロードします。少なくとも私のソリューションでは、ビューは非常に馬鹿げているので、自動テストでテストすることはせず、受け入れテストを行って、正しいつづりとボタンがあるべき場所にあることを確認します。dllのNUnitテストは非常に簡単です。
ブライアンベッチャー

0

私は数年前にNunit WinFormsを書いていました(6年と思います)。私が特に覚えていることの1つは、そのユニットテストケースですが、エンドツーエンドのテストケースとしても機能することです。フロントエンドでテストすることがあまりない場合があります(単純なフォーム)。したがって、ボタンクリックでポップアップするメッセージボックスをテストしようとしても、他のレイヤーのさまざまなメソッドを意図せずにテストしています。同様に自動化できないものもあります。自動化された単体テストを使用して、ルックアンドフィールとユーザビリティを自動化することはできません。リリースする前に、いくつかの手動テストを実行する必要があります。


顧客が画面を特定の方法で表示するか、特定の方法で変更する必要があると指定した場合、これらのことをテストできるはずです。仕様をテストとしてキャプチャすることはBDD方法論の中心であり、テストを自動化する手段を(創造的ではあるが)見つけることができない状況は一度もありません。本当の問題は、テストに価値があるかどうか、アプリケーションが最初からすべてのテストを自動化できるほど十分にファクタリングされているかどうか、そしてテストが費用効果があるかどうかです。しかし、そうではないこともあると思います。
S.ロビンス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.