19

Web サイトの機能テストを自動化するプロセスを改善するための提案を探しています。過去に試したことはこちら。

以前はWATINを使用したテスト プロジェクトがありました。「単体テスト」のように見えるものを効果的に記述し、WATIN を使用してブラウザーを自動化し、サイト内などをクリックします。

もちろん、サイトを実行する必要があります。そのため、実際にコードを Web プロジェクトからローカル ディレクトリにコピーし、テストを実行する前にそのディレクトリを指す Web サーバーを開始しました。

そうすれば、新しい人がソース管理から最新のものを取得してビルド スクリプトを実行し、すべてのテストが実行されるのを見ることができます。また、IDE からすべてのテストを簡単に実行することもできます。

私が遭遇した問題は、テストよりもテスト環境をセットアップするためのコードの保守に多くの時間を費やしたことです。コピーのせいで実行に時間がかかったことは言うまでもありません。また、インストールを含むさまざまなシナリオをテストする必要がありました。つまり、データベースをさまざまな初期状態に設定できる必要がありました。

機能テストを自動化してこれらの問題のいくつかを解決し、それをシンプルに保つためにあなたが行ったことに興味がありました。

MORE DETAILS 人々が詳細を尋ねてきたので、ここにある。Visual Studio と Cassini (組み込みの Web サーバー) を使用して ASP.NET を実行しています。私の単体テストは MbUnit で実行されます (ただし、それはそれほど重要ではありません。NUnit または XUnit.NET である可能性があります)。通常、別の単体テスト フレームワークですべての WATIN テストを実行します。AssemblyLoad フェーズでは、Web サーバーを起動し、すべての Web アプリケーション コードをローカルにコピーします。

あらゆるプラットフォームのソリューションに興味がありますが、それぞれの意味についてさらに説明が必要な場合があります。:)

4

6 に答える 6

11

フィル、

自動化は維持するのが難しい場合がありますが、自動化をデプロイに使用すればするほど、テストのセットアップに活用できます (逆も同様です)。

率直に言って、
NAnt やMSビルド。これは、NAnt のようなツールの比較的初期のユーザーであった多くの人々が Rake に移行した理由の 1 つです。Rake を使用すると、ビルド コードを他のコードと同様に扱う自由度 (コンテンツと形状を継続的に進化させる自由度) が大きくなります。Rake を使用すると、オートメーション アーティファクトで同じように簡単かつ迅速に停滞することはありません。Rake でスクリプトを作成する方が、NAnt や MSBuild よりもはるかに簡単です。

したがって、あなたの苦労の一部は本質的にツールに結びついています。自動化を適切に維持するには、NAnt や MSBuild などの静的ビルド ツールが課す障害に注意する必要があります。

アセンブリの読み込みからテスト環境のブートストラップを結合しないことをお勧めします。これは、簡単な利便性のみを提供するインサイド アウト カップリングです。IDE またはコマンド ライン、または C# REPL のような対話型コンソールからテストを実行する前に、コマンド ラインに移動し、環境をセットアップするビルド タスクを実行することには何の問題もありません (そして、おそらくすべてが正しいでしょう)。 Mono プロジェクト、または IRB から。

テスト データのセットアップは、単に厄介な場合があります。それは行われなければなりません。

データベースの状態を作成およびクリーンアップするために呼び出すことができるライブラリが必要になります。これらの呼び出しはテスト コードから直接行うことができますが、個人的にはこれを避ける傾向があります。これは、テスト データまたはサンプル データ制御コードの適切な使用方法が複数あるためです。

すべてのサンプル データ コントロールを HTTP から駆動します。サンプル データを制御するためのアクションを含むコントローラーを作成し、Selenium を介してそれらのアクションに対して GET を発行します。これらを使用して、データを作成およびクリーンアップします。これらのアクションに GET を構成して、セットアップ データの一般的なシナリオを作成し、データの特定の値をリクエスト パラメーター (または必要に応じてフォーム パラメーター) として渡すことができます。

これらのコントローラーは、通常「test_support」と呼ばれる領域に保管します。

Web サイトを展開するための私の自動化は、test_support 領域またはそのルートとマッピングを展開しません。デプロイ検証の自動化の一環として、test_support コードが本番アプリに含まれていないことを確認します。

また、test_support コードを使用して、環境全体の制御を自動化します。たとえば、サービスを偽物に置き換えたり、サブシステムをオフにして障害やフェイルオーバーをシミュレートしたり、認証をアクティブ化または非アクティブ化したり、これらのファセットに関係のない機能テストのためにアクセス制御を行ったりします。

Web アプリのサンプル データまたは Web からのテスト データを制御することには、二次的な価値があります。アプリのデモを行うとき、または探索的テストを行うときに、既知の (または推測可能な) URL に対していくつかの get を発行するだけで、必要なデータ シナリオを作成できます。 test_support エリアにあります。ここで安らかなルートとリソース指向に固執するために本当に訓練された努力をすることは、本当に報われるでしょう.

この機能の自動化 (テスト、デプロイ、デモなど) にはさらに多くの機能があるため、これらのリソースが適切に設計されているほど、長期にわたってそれらを維持する時間が長くなり、より多くの機会を見つけることができます。それらを予期しないが有益な方法で活用します。

たとえば、Web ページのセマンティック モデル上にドメイン モデル コードを記述すると、より理解しやすいテスト コードを作成し、脆弱性を軽減するのに役立ちます。これをうまく行えば、これらの同じモデルをさまざまな異なるドライバーで使用できるため、それらをストレス テストやロード テスト、機能テストで活用したり、探索ツールとしてコマンド ラインから使用したりできます。ちなみに、この種のことは、静的言語を使用する場合のようにドライバーの型に縛られていない場合の方が簡単です。多くの主要なテストの思想家や実行者が Ruby で作業し、Watir が Ruby で書かれているのには理由があります。再利用、構成、および表現力は、C# のテスト コードよりも Ruby の方がはるかに簡単です。しかし、それは別の話です。

いつか追いついて、残りの 90% についてもっと話しましょう :)

于 2009-08-08T06:33:28.157 に答える
1

なぜコードをコピーする必要があるのですか? Cassini はやめて、Visual Studio に仮想ディレクトリを作成してもらいましょう。Web アプリが変更された場合、開発者は Web テストを実行する前にビルドすることを忘れないでください。特に CI で Web テストを実行する場合、これは大した問題ではないことがわかりました。

データは大きな課題です。私の知る限り、不完全な選択肢の中から選択する必要があります。対処方法は次のとおりです。まず、大規模で複雑な従来の WebForms アプリを使用していることを説明する必要があります。また、ドメイン コードは、テスト プロジェクト内からテスト データを作成するのには適していません。

これにより、いくつかの選択肢が残りました。(a) ビルドの下でデータ セットアップ スクリプトを実行するか、(b) 実際の Web サイトを使用して Web テストを介してすべてのデータを作成します。オプション (a) の問題は、テストが細かいレベルでスクリプトと結合されることです。Web テスト コードを T-SQL と同期させることについて考えると頭がドキドキします。そこで、(b) を採用しました。

(b) の利点の 1 つは、セットアップでアプリケーションの動作も検証されることです。問題は...時間です。

理想的には、テストは独立していて、一時的な結合がなく (任意の順序で実行できます)、コンテキストを共有していません (共通のテスト データなど)。これを処理する一般的な方法は、すべてのテストでデータを設定および破棄することです。慎重に検討した結果、このルールを破ることにしました。

私たちは、私たちの戦略をサポートする優れた機能を提供する Gallio (MbUnit 3) を使用しています。まず、フィクスチャおよびテスト レベルで実行順序を指定できます。-4、-3、-2、-1 の 4 つの「セットアップ」フィクスチャがあります。これらは、指定された順序で実行され、デフォルトでは順序が 0 のすべての「セットアップされていない」フィクスチャの前に実行されます。

私たちの Web テスト プロジェクトは、単一の既知のユーザー名/パスワードという 1 つのことだけをビルド スクリプトに依存しています。これは私が一緒に暮らすことができるカップリングです。セットアップ テストが実行されると、データの識別子 (会社、ユーザー、ベンダー、クライアントなど) を保持する「データ コンテキスト」オブジェクトが作成されます。このオブジェクトは、後で他のすべてのフィクスチャで使用されます (変更されることはありません)。(識別子とは、必ずしもキーを意味するわけではありません。ほとんどの場合、Web UI は一意のキーを公開しません。真の識別子の名前または他のプロキシを使用してアプリをナビゲートする必要があります。これについては以下で詳しく説明します。)

Gallio では、テストまたはフィクスチャが別のテストまたはフィクスチャに依存するように指定することもできます。前例が失敗すると、従属はスキップされます。これにより、多くの混乱を招く可能性のある「カスケード障害」が防止され、一時的な結合の弊害が軽減されます。

各テストの前ではなく、ベースライン テスト データを 1 回作成すると、作業が大幅に高速化されます。ただし、セットアップ テストの実行にはまだ 10 分かかる場合があります。新しいテストに取り組んでいるときは、頻繁に実行して再実行したいと考えています。もう 1 つの優れた Gallio 機能であるアンビエンスを入力してください。アンビエンスは、オブジェクトを永続化するための非常に簡単な方法を提供する DB4 のラッパーです。これを使用して、データ コンテキストを自動的に永続化します。したがって、セットアップ テストは、データベースの再構築の間に 1 回だけ実行する必要があります。その後、他のフィクスチャの一部またはすべてを繰り返し実行できます。

では、テスト データのクリーンアップについてはどうでしょうか。既知の状態から開始する必要はありませんか? これは、破る方がよいと判断したルールです。私たちにとってうまくいっている戦略は、会社名、ユーザー名などに長いランダム値を使用することです。衝突しないように、論理的な「データ空間」内でテストを実行し続けることはそれほど難しくないことがわかりました。他のデータに。確かに、テストに失敗したファントムを何時間もかけて追跡し、それがデータの衝突であることが判明する日を恐れています。これは、現在私たちのために働いているトレードオフです。

私たちはWatinを使用しています。めっちゃ好きだよ。成功へのもう 1 つの鍵は、Scott Bellware がほのめかしたものです。テストを作成すると、UI の抽象モデルが構築されます。したがって、これの代わりに:

browser.TextField("ctl0_tab2_newNote").TypeText("foo");

これは、テストで確認できます。

User.NotesTab.NewNote.TypeText("foo");

このアプローチには 3 つの利点があります。まず、魔法の文字列を繰り返すことはありません。これにより、もろさが大幅に軽減されます。第二に、テストは非常に読みやすく理解しやすいものです。最後に、Watin フレームワークのほとんどを独自の抽象化の背後に隠します。2 番目の例では、TypeText だけが Watin メソッドです。これにより、フレームワークの変更に合わせて変更しやすくなります。

お役に立てれば。

于 2009-08-08T19:39:53.143 に答える
1

現在、asp.net mvc アプリケーションの自動ビルド プロセスを使用しています。

以下のツールを使用します。

  • チームシティ
  • SVN
  • nUnit
  • セレン

任意の数のマシンであるビルド エージェントで実行される msbuild スクリプトを使用します。msbuild スクリプトは、svn から最新バージョンのコードを取得してビルドします。

成功すると、アーティファクトが特定のマシン/フォルダーに展開され、IIS に仮想サイトが作成されます。

次に、MSBuild contrib タスクを使用して SQL スクリプトを実行し、データベースをインストールしてデータをロードします。復元を行うこともできます。

成功したら、nUnit テストを開始します。テストのセットアップでは、Selenium が稼働していることを確認してから、Watin とほぼ同じ方法で Selenium テストを実行します。Selenium には、c# にエクスポートできるテスト用の優れたレコーダーがあります。

Selenium の良いところは、前回見たときの Watin のように IE に制限されるのではなく、FF、Chorme、IE を駆動できることです。Selenium を使用して Selenium Grid で負荷テストを行うこともできるため、同じテストを再利用できます。

成功すると、msbuild は svn でビルドにタグを付けます。TeamCity には、ビジネス ユーザーが翌朝プロジェクトのステータスを確認できるように、最新のタグをステージング環境にデプロイする夜間に実行されるジョブがあります。

以前は、環境を完全に管理する (Java、Selenium などのインストール) ための nant および msbuild スクリプトがありましたが、これにはかなりの時間がかかるため、前提条件として、各ビルド エージェントにこれらがインストールされていると想定しています。そのうちに、これらのタスクを含める予定です。

于 2009-08-08T07:03:20.610 に答える
0

Mavenを使用して統合テストフェーズをビルドプロセスに組み込むことは困難でしたが、不可能ではありませんでした。起こったことは本質的にこれでした:

  • 統合テストフェーズが起動しない限り、特定のディレクトリ内のすべてのJUNitテストを無視します。
  • Mavenプロファイルを追加して、統合テストを実行します。
  • 統合前のテストフェーズの場合-

  • テストデータベースにヒットするアプリケーションを実行しているJettyを起動します。

  • セレンサーバーを起動します
  • 統合テストフェーズでセレン統合テストを実行する
  • セレンサーバーを停止します
  • セレンを止めろ

このステップの難しさは、実際に突堤を設定することでした-戦​​争から起動するだけではうまくいかなかったので、実際には突堤で戦争を開梱してからサーバーを実行する必要があります-しかし、それはうまく機能し、自動化されています- mvn -PintegrationTest(統合テストのプロファイル名)と入力するだけで、すぐに使用できます。

于 2009-08-06T16:45:12.027 に答える
0

ビルド終了後に自動的にテストを開始するということですか? ビルドが正常に準拠している間に、ビルド ファイルを動作中の IIS にコピーする自動化されたスクリプトを作成できます。次に、mstest.exe またはその他のメソッドを呼び出して、自動化された BVT を開始します。

autoitx や、Python、ruby などの関数言語を試してみてください。

于 2009-08-12T07:33:26.690 に答える