Webフォームサイトを単体テストするにはどうすればよいですか?


26

Webフォームサイトを単体テストするにはどうすればよいですか?それの多くは状態とユーザー入力に依存するので、それは実行可能ではないように思えます。

実行可能でない場合、有効な自動化された代替手段はありますか?


2
自動化されたユーザーインターフェイステストが必要な場合は、Seleniumなどが必要になります。ただし、自動化された単体テストが必要な場合は、Seleniumは必要ありません。適切なパターンが必要です。私の答えをご覧ください。
マシューロダタス

回答:


22

はい、できます。懸念をうまく分離するように注意する必要があります。つまり、コードビハインドからすべてのロジックを削除し、他のクラスに配置する必要があります。

これを行うには、2つの一般的な方法があります。

簡単な方法は、「システムはどのような情報を提供しますか?ページにどのような情報を入力する必要がありますか?」という観点からすべてのイベントハンドラを再考することです。そして、その変換を行うサービスクラスを提供します。

この場合、サービス層はプレゼンテーション層の性質についてほとんど知る必要がありません。サービスから返されたデータを取得して、コードビハインドにWebFormの正しいコンポーネントを入力する必要があり、これはテストされません(少なくとも単体テストでは、統合テストを使用できます)。しかし、これはコードがうまくいかない場合はめったになく、ロジックで失敗する可能性がはるかに高いです。

より複雑ですが、より効果的な方法は、モデルビュープレゼンターパターンを使用することです。それを試してみると、プレゼンターはすぐにフレームワークと非常に連動するようになり、MVPを開発すればするほど、MVPは本当にMVCになりたかったが、できなかったことが明確になりました。

とはいえ、他の人はこれを非常にうまくやっています-webformsmvpフレームワークさえあれば、重いものを取り除くことができます-あなたの走行距離は変わるかもしれません。


1
@jmoreno:いいね!過去5年間でWebFormsとMVPが存在することさえ忘れていました。
PDR

16

明らかに、Webフォームページ全体はユニットではないため、ユニットテストを行うことはできません。ただし、自動テストのためにできることがいくつかあります。

  • ページの個々のコンポーネントの単体テスト(実際のロジックを実行するメソッド)
  • ページで使用される単体テストコンポーネント(カスタムコントロール、基になるビジネスロジックなど)
  • 自動化された機能テスト(ブラウザをリモート制御するか、cURLなどを介してHTTPリクエストを送信する)
  • 自動化された侵入テスト(可能な注入ポイントを見つけ、ページ上で無害であるが検出可能な注入攻撃を自動的に実行しようとするツールがあります)
  • 負荷試験
  • ユーザビリティとハウススタイルの箇条書きのリストに対してレイアウトをチェックします(これは自動化するのは非常に難しいですが、通常は時々手動で行うほうがより実行可能です)

-1申し訳ありませんが、負荷テスト、侵入テストやレイアウトチェックはユニットテストとは何の関係もありません
トム・スクワイアーズ

2
@TomSquires:もちろんそうではありません。あなたが私の答えを注意深く読んだら、私は彼らが言ったことがないことに気付くでしょう。しかし、この質問は単体テストと自動テストの一般的な概念を混同しているようです。そのため、Webフォームでスローできるさまざまな意味のある自動テストをリストしました。
tdammers

そのまだ良いが、何でもすることができます自動化するのに同意し、Webページをテストすることは、厳格な定義によって、その後のユニットテストのテストの統合のいくつかの形式である可能性が高い
JK。

6
@TomSquires:完全に不当な下票。あなた自身の質問は、サイト全体をテストすることから始まります。これは、単体テストとは関係ありません。Tdammersは、全体と部品をテストするさまざまな方法を特定し、ユニットテストが適合する場所を特定しました。+1
azheglov

3
けっこうだ。私はそれを取り戻します
トムスクワイアズ

9

質問の「ユニット」の部分をなくしてすみません...

SeleniumHQは、フロントエンドからのテストの友です。ブラックボックステストのような、ユニットテストではありません。あなたはまだ有効なテストケースを考える必要があります...


1
+1「答えを投稿する」を押してまったく同じことを言うと、あなたの答えが出てきました。
ヤニス

2
また、opは単体テストについて尋ねているので、実際に問題になっているのは機能テストであり、ユーザー入力要素をテストする場合により適切(実用的、実行可能)であると付け加えましょう。
ヤニス

+1 cos私はそれを使用する意味を持ち続けていますが、決して使い物になりません。誰もがそれを使用しましたか、それは良いと実装する価値がありますか?
ニムチンプスキー

6
Seleniumは素晴らしいツールですが、単体テストとはまったく関係ありません。
pdr

確か

6

経験から言えば:それが正しく行われた場合のみ。「正しい」とは、最小限のコードビハインドと、上記のModel-View-Presenterのようなものを意味し、Webフォームを「ダム」にします。ブラウンフィールドアプリケーションは、これを念頭に置いて設計されたものではなく、使用するためにページをリファクタリング/書き換えするのはほとんど人間の努力であるため、これは通常非常に困難です。


1

ワチン

単体のWebテストは、リグレッションバグまたは新しいプロジェクトの一般的なアイデアを伝えるためだけのものであっても、非常に便利だと思います。

状態に関する限り、非UIテストの場合と同じようにユニットテストを作成します。テストの開始時にデータベースをクリアし、データベースを再構築して開始状態以外の情報を含めません。各ユニットテストは、単一のページ、または通常はページ上の個別のタスクをカプセル化します。

http://watin.org/は別のWebテストツールですが、C#/。NET用です。テストは単体テストとして記述します。

[Test] 
public void SearchForWatiNOnGoogle()
{
  using (var browser = new IE("http://www.google.com"))
  {
    browser.TextField(Find.ByName("q")).TypeText("WatiN");
    browser.Button(Find.ByName("btnG")).Click();

    Assert.IsTrue(browser.ContainsText("WatiN"));
  }
}

現在IEベースですが、FirefoxとChromeの実験的なサポートがあります。Javascriptインタラクションなど、手動テストで行うことはほとんどすべて自動化できます。


2016年だということを確認してください。今日のWatiNサイトへの訪問は、WatiNがおそらく死んでいることを私に示しています。ドキュメントは最新ではなくまばらであり、ビデオは再生されません。私は不満を言っていません -私はオープンソースの自発的なツールに大きな感謝をしています-このコメントは私のような他の最近来た人を助けるためです。答えは問題ありません。開始するには、自主的な実践的な学習が必要な場合があることを指摘するだけです。
qxotk

1
:WatiNの方法のいずれかの思考のための更なるヘルプは、確認はそれが現在ここに一日で見て停滞+だstackoverflow.com/questions/118531/...
qxotk

0

Webリクエストが有線(またはTCPスタック経由)で発生するため、Webサイトを実際に単体テストすることはできません。したがって、テストは「単体テスト」の定義に適合せず、エンドツーエンドのテストになる可能性があります。

これらの種類のテストでは、Seleniumなどのスイートを使用して、バックグラウンドでWebブラウザーを実行できます。しかし、警告の言葉:通常、この種のテストは非常に困難であり、多くの可動部分があるため予測不可能です!

さらに興味深いことに、Webフォームをまったくテストする必要ある理由が少し心配です。コードビハインドにあまりにも多くのロジックを入れすぎて、万が一の貧弱なビジネスロジックがありませんか?


-1

ジャスミン

過去5年間、Jasmineはフロントエンドの単体テストの主要ツールとして登場しました。Nodeとnpmを使用した自動ビルドテストに組み込まれることがよくあります

https://en.wikipedia.org/wiki/Jasmine_(JavaScript_testing_framework)ごと:

JasmineはJavaScript用のオープンソーステストフレームワークです。[2] JavaScript対応のプラットフォームで実行し、アプリケーションやIDEに侵入しないようにし、読みやすい構文にすることを目指しています。これは、ScrewUnit、JSSpec、JSpec、RSpecなどの他のユニットテストフレームワークの影響を大きく受けています。[3]

JavaScriptについてのすべての言及にもかかわらず、プレーンなWebフォームの単体テストにも使用できます。


JavaScriptはWebフォームで使用されますが、UIを更新する主な方法ではありません
トムスクワイアズ

本当です。ただし、代替手段は...?だから、ジャスミンは目的のためではありませんが、非常にうまく機能します。さらに、構文は、Rubyプログラマーが愛するRSpecとほぼ同じです。
マイケルデュラント

-2

ASP.NET

ASP.NETサイトを開発するとき、次のユニットテストを実行できました。

  • ドメイン
  • BLコントローラー/プレゼンター
  • Webフォームページの分離コード

アーキテクチャに応じて、これらすべてをTDDすることができます。単体テストができないのは、マークアップファイルのレイアウトだけです。


3
この答えは、「どのように」という質問に対して「はい」です。まったく役に立たない。
ラバーダック16
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.