web-dev-qa-db-ja.com

ASP.NET Webフォームの単体テスト/ TDDを理解する

私は小規模なソフトウェア会社(現在は自分を含めて4人の開発者)の主任プログラマーであり、企業向けに特注のASP.NET WebFormsアプリケーションを開発しています。 2010年に卒業直後に入社したので、初めての仕事でした。より多くの上級プログラマーが去った後、私は主導に昇進し、私はメンターのためにたくさんのジュニア開発者を雇いました。

私の問題は、現在、プロジェクトの遅延(2〜3年程度の遅延)による膨大な作業があるため、開発が非常に急いでおり、テストが最後まで残されており、多くの場合、リリースには明らかなバグがあり、拾うべきだった。これは本当に士気を低下させ、私を含むすべての人に非常にストレスを与えます。

私たちはテストフレームワークをまったく持っておらず、私たちがやろうとしていることに対する組織さえほとんどありません。ユニットテストを使用することはありません。すべてのテストは手動で行われ、非常に手間がかかります。この種の方法論は、プログラマーになって以来、私がさらされてきたすべてですが、これがソフトウェアハウスが機能する方法ではないことをすぐに理解しています。

私はTDDと単体テストに慣れるように努めてきましたが、それはすべて私にとって非常に異質であり、アプリケーションでこれらを実際に使用する方法を視覚化するのに苦労しています。私たちのアプリ内のロジックのほとんどは、各ページの背後にあるコード(私が今離れようとしているもの)にあり、これを読んだことから、テストがはるかに困難になっています。

TDDを使い始めるのに役立つアドバイスや優れたチュートリアルを知っている人はいますか?

SVNを効率的に使用していない、バグの非常に基本的なヘルプデスクを備えている、チームにかなり曖昧な仕様を提供しているなど、他にも多くの問題があります。繰り返しますが、これらは私自身が学びたいことですが、実際に自分自身にすべてを教えるために多くの時間を費やす必要があります。だから誰かがこれについてアドバイスがあれば私はそれを感謝しますが、私たちのテストは現在最も重要なことです。

6
Chris

私は似たような場所にいるので、最善のサポートを提供することはできません。他の答えを見つけたいと思っています。

しかし、私はRoy Osheroveの「 The Art of Unit Testing。 "を熱心に推奨することができます。これは.NETに焦点を当てており、ユニットテストで目指すべきことについて多くのアイデアを提供します。

私がこれまでに知っていることから、コードを中央クラスにプッシュし、背後のコードから解放するのは正しいことです。私は、MVCによって奨励されているのと同様に、懸念をより適切に分離した、より集中化されたアーキテクチャに向けて取り組んでいます。 (おそらく、アーキテクチャに慣れるためだけにMVCを検討する価値があるでしょう。履歴書も傷つけないでしょう。)

7
Jamie F

まず第一に、あなたはこれを理解するのに苦労していることを間違いなく悪く感じるべきではありません。 WebFormsは、テスト容易性を念頭に置いて設計されたフレームワークではありません。また、テスト自体を簡単にすることはできません。

最初で最も重要なことはすでにJamie Fの回答で述べられています。できるだけ少ないコードが.aspxページの分離コードにあり、できるだけ多くのコードが個別のビジネスロジッククラスにあることを確認する必要があります。コードビハインドのコードは、ASP.NETコントロールをあちこちに接続するだけで、その他はほとんどありません。これにより、既存のビジネスロジックに関する単体テストを開始し、TDDアプローチを使用して新しいビジネスロジックを開発できます。

実際のWebインターフェースについては、ブラウザーの自動化テストフレームワークを調べた方がよいでしょう。 WatiNSelenium の2つは、思い浮かぶ2つです。しかし、ブラウザー自動化テストにTDDアプローチを採用する方法はわかりません。私の考えでは、これらの手法は、開発が完了した後に回帰テストをセットアップするのに非常に適しています。

7
Carson63000

他の人が書いたように、Webフォームはテスト容易性を念頭に置いて開発されていませんが、MVC、MVP、MVVMなどのパターンを学習することで、生活をはるかに簡単にすることができます。特にWebフォームはMVPで非常にうまく機能します。

Dino Espositoには、WebフォームでのMVPの使用に関する素晴らしい記事 ここMSDNで があります。また、依存関係の注入、制御の反転、テストなどを考慮してゼロから構築されたASP.NET MVCを確認することもできます。

基本的に、懸念事項を最も明確に分離する必要があります。これを形式化するために、 アスペクト指向プログラミング を調べてみてください。懸念事項の分離を強制することで、単体テスト、依存性注入、およびテストを単純化するために必要なすべてのことをはるかに簡単にします。私はJavaでSpringを使用しており、Spring.NETにもあるAOPモジュールがあるので、一見の価値があります。

私の提案は次のとおりです:

  • アプリケーションを可能な限り完成させます。
  • Webフォームでビジネスロジックと表示ロジックを混在させないでください
  • WebフォームのMVPやMVVMなどのパターンを調べます
  • ビジネス目標に適合する場合は、ASP.NET MVCへの移行を検討してください
  • アプリケーションを分離するために依存性注入を採用する
  • ユニットテストを記述してコードをテストする
  • 自動化テストを使用してインターフェースをテストする

私がMVP/MVVMを提案する理由は、これらのパターンがビューからのデータモデルの分離を強制するのに役立ち、したがって、懸念の分離を強制するのに役立つためです。

幸運を!

5
Sam

TDDはパラダイムシフトであり、一種のテストです。また、いくつかの一般的な単体テストのメリットもあるように思えます。また、チームが従う2つの新しい「ポリシー」も役立ちます。旅に出る前に物事をいくつか組み合わせ、チームが参加していることを確認します。参加していない場合は、記事とデモで説得してください。それらが含まれていることを確認し、途中でフィードバックを得ます。

TDD(テスト駆動開発)は、最初にテストを記述し、次にテストに合格するためのコードを記述します。これはうまく機能することが証明されており、多くの人が背後にいます。このタイプの戦略でプロジェクトを開始する方が、実装するよりも簡単です。途中で、サポートするコード構造がありません。これについては、多くのリソースが利用できます。

次に、ユニットテストを実行します。これは、場合によっては、後で実装するよりも早く実装するのに適しています。このタイプの戦略は、コードのテストに役立ちます。あなたはあなたのコードを書いて、それをテストします(アレンジ/アクト/アサート)。ユニットテストでは、適切な入力を行うと、適切な出力が得られることを確認します。 Visual Studioにはテストフレームワークが組み込まれており、 XUnit も、使いやすく、実装しやすい、優れたテストフレームワークです。

分離コードから参照できる個別のアセンブリで開発を開始することを習慣にしていきます。これは再利用性を生み出し、ニースの「階層化」アプローチに向けて始まります。長い命名規則を使用し、クラスを整理して整頓するようにしてください。それも、既存の開発プロセスの多くを邪魔してはなりません。

IMO、次のステップは、コードベースから「動作グループ」の識別を開始し、それらから interfaces を作成することです

  • すべての共通のアイデアに関連するアプリケーション内の共通のメソッドを分離します。
  • そのインターフェイスを実装するクラスを作成し、コードビハインドからメソッドにコピー(実際にカット)して、それらがそのインターフェイスを実装するようにします(そのアセンブリを参照し、コードビハインドメソッドを「新しい」メソッドで置き換えます)。
  • 最終的には、これらのインターフェースを使用して、テスト容易性(ディペンデンシーインジェクション、IoCコンテナーなど)を含むすばらしい動きを始めることができます。

既存のコードベースを使用するのは非常に簡単であり、それを実行することの利点は非常に高いため、インターフェースを引き出すことから始めるのが良いと思います。これは件名(BDD?)について話す良いビデオです 統合テストは詐欺

最後に、 Team Foundation Service をお勧めします。 5人のメンバーが無料になるので、チームが無料版に参加できるようです。これは、あなたとあなたのチームが組織化された開発の方向に進むのを助け、ソース管理とバグ追跡、「ビッグボード」(本当にクールです)、その他の多くのクールな機能を提供します開発者に役立つ優れた管理ツール。

私はこれの少なくともいくつかが役に立てば幸いです。

2
hanzolo

。NETでのブラウンフィールドアプリケーション開発

は、開発者が新しいプロジェクトに適用する最先端の概念、パターン、およびツールを使用して、レガシーアプリケーションにアプローチする方法を開発者に示しています。

2
radarbob