Visual Studio 2012 自習書
第 5 回
Web アプリケーションのテスト (後編)
更新日: 2013 年 7 月 4 日
ダウンロード (PDF、2.98 MB)
目次
- WEB パフォーマンス テスト
- 負荷テストの実践
ページのトップへ
4. Web パフォーマンス テスト
2 つ目のハンズオンでは、Visual Studio を使った Web パフォーマンス テストを体験します。
図 4.1
Web パフォーマンス テストは、Controller に対するテストとして実施されますが、単体テストとは異なり HTTP Request を通して Controller にアクセスします。つまり、IIS や ASP.NET の基本的な仕組みを経由して Controller へアクセスを行います。
このため、Controller 単体で考えると関連するコンポーネントが増えるため、単体テストとしての純粋性は薄れてしまいますが、ASP.NET MVC 自体がルーティングやリダイレクト、メンバーシップといった機能を活用したフレームワークであるため、これらを包括的に使用した状態での Controller に対するテストが可能になります。
Web アプリケーションのホスティング先として、今回はローカル PC 上のデバッグ用の環境を利用します。"SampleWeb" プロジェクトをデバッグ実行し、立ち上がったブラウザーにおいてアクセスしている URL を確認してください。通常は "http://localhost" にポート番号を加えた URL となります。下記の画面ショットでは https://localhost:13489/ となっています (ポート番号は環境や実行タイミングにより異なります)。URL が確認できたら、デバッグ実行を終了してください。
図 4.2
ソリューション エクスプローラーの "SampleWeb" ソリューションの項目で右クリックを押し、表示されたメニューから「追加」→「新しいプロジェクト」を選択します。
図 4.3
表示されたウィンドウで「テスト」のカテゴリから「Web パフォーマンスとロード テストのプロジェクト」を選択し、名前として "SampleWebPerformanceTest" と入力し、「OK」をクリックします。
図 4.4
これにより、ソリューションに "SampleWebPerformanceTest" プロジェクトが追加されるとともに、"Solution Items" として "Local.testsettings" ファイルが追加されます。
図 4.5
※ Local.testsettings ファイルは、「Web パフォーマンスとロード テストのプロジェクト」の追加により新規に作成されます。既存の単体テストのプロジェクト "SampleWeb.Test" に新しい項目として Web パフォーマンス テストや、ロード テストを追加しても作成されませんのでご注意ください (Local.testsettings ファイルはこの後の手順で使用します)。
下記のように、WebTest の定義情報 ("WebTest1.webtest") が表示されるので、メニューから「記録の追加」ボタンをクリックします。
図 4.6
"Web テスト レコーダー" のアドインが表示された状態でブラウザーが立ち上がります。
図 4.7
手順 1 で確認した URL をブラウザーに入力します。ローカル PC 上の Web サーバーにアクセスし、画面が表示されます。この際に "Web テスト レコーダー" において、該当する URL にアクセスしたことが記録されています。表示された Web 画面において「ログイン」をクリックしてください。
図 4.8
ログイン画面が表示されますので、ユーザー名に "admin1"、パスワードに "Password1" を入力し、また、「このアカウントを記録する」にチェックをつけて、「ログイン」をクリックしてください。
図 4.9
画面上に「こんにちは」 + 「ユーザー名」 + 「!」、というメッセージが表示されていることを確認し、「ログオフ」をクリックしてください。
図 4.10
"Web テスト レコーダー" の停止を押してください。ブラウザーが閉じ、Visual Studio に戻ります。
図 4.11
Visual Studio において "Web テスト レコーダー" にて記録された情報を元に、以下のように WebTest が表示されます。この WebTest ではサーバー (今回の場合はローカル PC) に対して送信された HTTP Request の内容がテストの内容として定義されています。
図 4.12
左上のメニュー (三角フラスコのアイコン) をクリックするとメニューが展開されるので、「テストの実行」を選択します。
図 4.13
※ Web パフォーマンス テストで作成したテストは、「テスト エクスプローラー」で表示されません。
WebTest に定義されているリクエスト順に Web サーバーへのアクセスが行われ、すべてのリクエストの実行が終了すると、以下のようなテスト結果が表示されます。
図 4.14
Web パフォーマンス テストでは、記録した HTTP Request を連続して再実行することが可能で、その際にサーバーから応答を受けるまでにかかった時間や、受信したデータのバイト数などを確認できます。また、各リクエストに関して、リクエスト(「要求」) の内容やレスポンス (「応答」) の内容を確認できます。
また、「詳細」のタブを利用すると、Web 操作を記録した際に受け取ったいくつかの情報 (例えば POST リクエスト後の画面遷移の情報) などから自動的に生成された検証規則に対して、今回のテストの実施結果は合致しているかどうかを確認することが可能です。
図 4.15
次に、この Web パフォーマンス テストをカスタマイズしてみたいと思います。手順 6 で紹介したように、今回の Web アプリケーションでは、ログイン後に「こんにちは」 + 「ユーザー名」 + 「!」というメッセージが表示されます。この内容の確認を自動化するための「検証規則」を追加しましょう。
WebTest の定義において、2 つ目の "http://<サーバー名>/Account/Login" のリクエスト部分で、右クリックを押し、表示されたメニューから「検証規則の追加」を選択します。
図 4.16
※ 今回の自習書の手順では "http://<サーバー名>/Account/Login" のリクエストが 2 つあります。1 つ目は Login 画面を表示するための GET リクエストで、2 つ目は実際にログインを行うためにユーザー名、パスワードを送信している POST リクエストです。今回の検証規則は、この 2 つ目のリクエストに対して追加します。
「検証規則の追加」のウィンドウが表示されますので、左側の一覧から「検索テキスト」の項目を選択し、右側に表示された「選択された規則のプロパティ」の「検索テキスト」のプロパティに、"こんにちは" と入力し、「OK」をクリックしてください。
図 4.17
WebTest の定義の左上のメニュー (三角フラスコのメニュー) から「テストの実行」を選択します。
図 4.18
テストの結果において、2 つ目の "http://<サーバー名>/Account/Login" リクエストの結果として表示される "http://<サーバー名>" のレスポンス情報において「詳細」タブを確認すると、「検索テキスト」として、「こんにちは」の文字列の検証が行われていることを確認できます。
図 4.19
次にフォーム ポスト パラメーターにおいて、外部データを使用する方法を確認します。WebTest の定義のメニューにおいて、「データ ソースの追加」メニューをクリックします。
図 4.20
表示された「テスト データ ソース作成ウィザード」にて、データ ソース名に "UserData" と入力し、種類として "CSV ファイル" を選択し、「次へ」をクリックします。
図 4.21
事前準備の「手順 7」で作成した "Data.csv" を選択します。選択後、データのプレビューが表示されますので、確認し「完了」をクリックします。(この後、データ ソースのファイルを現在のプロジェクトに追加してよいか、という確認のダイアログが出ますので、「はい」を押して追加を行ってください)
図 4.22
WebTest の定義において、以下のように「データ ソース」が追加されていることを確認してください。
図 4.23
次に、このデータ ソースをフォーム ポスト パラメーターで使用するように設定を行います。WebTest の定義で 2 つ目の "http://<サーバー名>/Account/Login" のリクエストの内容を展開し、"フォーム ポスト パラメーター" の中に記述されている UserName の項目を右クリックし、表示されたメニューから「プロパティ」を選択しプロパティを表示します。「値」の項目を選択した際に右側に表示されるドロップダウン メニューをクリックし、表示されるデータの中から「UserData」を選択し、展開した内容から "User" を選択します。
図 4.24
同様にフォーム ポスト パラメーターの "Password" においても、「UserData」の "Pass" とのバインドを設定します。
図 4.25
Visual Studio のメニューから、[テスト] を選択し、[テスト設定] の [テスト設定ファイルの選択] をクリックします。
図 4.26
ソリューションのフォルダーの直下にある "Local.testsetting" を選択します。
次に、ソリューション エクスプローラー上において、Local.testsetting を右クリックし、表示されたメニューから「開く」を選択します。
図 4.27
[テストの設定] ウィンドウが表示されるので、「Web テスト」の項目を開き、「データ ソース行ごとに 1 実行」を選択し、「適用」を行ってから、「閉じる」をクリックします。
図 4.28
WebTest の定義の画面から、テストの実行を行います。
図 4.29
テストが開始され、以下のように 3 回分 (UserData のデータの行数分) テストが実施されます。
図 4.30
「1 の実行」「2 の実行」「3 の実行」それぞれの結果を確認すると、UserData のデータ分の繰り返しが行われたことを確認できます。
例えば、3 の実行の 2 つめの Login リクエストの結果を確認すると、ユーザー名 "admin3" でログインに成功していることを確認することができます。
図 4.31
ここでは以上で 2 つ目のハンズオンを終了します。
2 つ目のハンズオンでは、Visual Studio を使った Web パフォーマンス テストについて学びました。
- (1) Web パフォーマンス テストの基礎
- (ア) Web テスト レコーダーによる HTTP Request の記録
- (イ) Web パフォーマンス テストの実行
- (2) Web パフォーマンス テストのカスタマイズ
- (ア) 検証規則の追加
- (イ) 外部データを使ったデータ駆動テストの実行
ページのトップへ
5. 負荷テストの実践
3 つ目のハンズオンでは、Visual Studio を使った負荷テスト (ロード テスト) を体験します。
図 5.1
負荷テストはそのテスト目標によって以下の 2 つのパターンに分類されます。
1. (狭義の) 負荷テスト
Web アプリケーションの運用中に予測されるワーク ロードや負荷の量を前提としたときの、テスト対象のシステムやアプリケーションのパフォーマンス特性を判断または検証することに重点を置きます。
2. ストレス テスト
Web アプリケーションの運用中に予測される状態を超えたときの、テスト対象のシステムやアプリケーションのパフォーマンス特性を判断または検証することに重点を置きます。このようなテストでは、アプリケーションがどのような状態で、どのように失敗するか、および障害の発生を警告するためにどのようなインジケーターを監視できるかを判断できるように設計します。
Visual Studio の負荷テスト機能では、このいずれの場合のテストにも利用することができます。
2 つ目のハンズオン (Web パフォーマンス テスト) で作成した Web パフォーマンス テストのプロジェクトにおいて、追加でもう 1 つの Web パフォーマンス テストを作成します。ソリューション エクスプローラーにおいて、"SampleWebPerformanceTest" のプロジェクトを右クリックし、表示されたメニューから [追加] → [Web パフォーマンス テスト] を選択します。Web テスト レコーダーのアドインが起動した状態でブラウザーが立ち上がりましたら、2 つ目のハンズオンでアクセスしたローカル PC の Web サーバーにアクセスします。最初に「ホーム」のページが表示されるので、ナビゲーションから「バージョン情報」を選択し(http://<ホスト名>/Home/About)、次に「連絡先」(http://<ホスト名>/Home/Contact) を選択し、最後に「ホーム」(http://<ホスト名>) をクリックします。これが終わりましたら、Web テスト レコーダーで「停止」をクリックし、記録を終了します。
図 5.2
ソリューション エクスプローラーにて、ファイル "WebTest2.webtest" が追加されたことを確認してください。
図 5.3
次にロード テストの項目を追加します。ソリューション エクスプローラーにおいて、
"SampleWebPerformanceTest" のプロジェクトを右クリックし、表示されたメニューから [追加] → [ロード テスト] を選択します。
図 5.4
ロード テスト追加用のウィザードが表示されますので、「次へ」をクリックします。
図 5.5
最初の設定画面では、ロード テストのシナリオの概要を決定します。シナリオの名前として「基本シナリオ」と入力し、テスト イテレーションの待ち時間を「5」秒に設定しておきます。また、待ち時間のプロファイルに関しては (デフォルトで設定されている) 正規分布を選択します。すべて設定が確認できたら「次へ」をクリックします。
図 5.6
次にロード (負荷) のパターンを決めます。Visual Studio のロード テストでは、用意されたテストシナリオ (今回は 2 つ目のハンズオンで作成した Web パフォーマンス テストを使用します) をもとに、仮想的なユーザーが一斉にそのシナリオに基づいて Web アクセスを行った場合の振る舞いをテストできます。
図 5.7
上記のように表示されている画面において、2 つの選択肢のうち上の選択肢 (「持続ロード」) は固定数の仮想ユーザーによって Web アプリケーションへのアクセスを行う場合に利用します。この 3 つ目のハンズオンの冒頭において分類した負荷テストのパターンのうち、狭義の負荷テスト、として分類されるテストを行う際などに利用します。
また、下の選択肢 (「ステップ ロード」) は一定間隔ごとに仮想ユーザーを増やしながら、アプリケーションの振る舞いをテストする際に利用します。
今回はステップ ロードにて、「10 人」の仮想ユーザーで開始し、「20 秒毎」に仮想ユーザーを「10 人」ずつ増やす、という設定にします。また、最大のユーザー数を「100 人」と設定します。設定が確認できたら「次へ」をクリックします。
図 5.8
次の画面ではロード テストを実施する際に、どのようにシナリオを実行するかを選択します。例えば、「ユーザーのペース」を選択すると、各仮想ユーザーが 1 時間当たりに実行するテストの数を設定できます。
図 5.9
"社員数 2000 名の企業において運用する社内の情報共有のサーバーにおいて、15 分に 1 回程度の割合でユーザーがアクセスを行う。" といったシナリオの場合に、手順 6 で設定しているロード パターンの最大ユーザー数を 2000 ユーザーとしたうえで、この「ユーザーのペース」を選択し、次の画面にて利用するテスト シナリオとその 1 時間あたりの実施回数 (この場合は 1 時間で 4 回の実施) を設定することで、このようなシナリオに基づく負荷テストが可能になります。
図 5.10
今回はよりランダムな状況で Web アプリケーションの性能上限を確認する、ということを目的に負荷テストを行う、と仮定し「テストの合計数」を選択し、「次へ」をクリックしてください。
図 5.11
次に、テストのシナリオ選択の画面が表示されますので、「追加」を押してください。
図 5.12
新しく立ち上がった「テストの追加」画面で、"WebTest1" を選択し、真ん中の矢印 (>) をクリックしてください。
図 5.13
引き続き "WebTest2" を選択し、真ん中の矢印 (>) をクリックします。右側の「選択されたテスト」に "WebTest1" と "WebTest2" が表示されているのを確認したら「OK」をクリックして「テストの追加」画面を閉じてください。
図 5.14
次に選択した "WebTest1" と "WebTest2" のシナリオを、どの程度の割合で実施するかを入力します。今回 "WebTest1" は「ログインを行いその後ログアウトを行う」シナリオで、"WebTest2" は「ページを順に閲覧する」シナリオとなっていますので、「ログインを行うユーザーのほうが少ない Web アプリケーション」と仮定し、"WebTest1" の割合を 30%、"WebTest2" の割合を 70% とします。今回は手順 7 においてテスト ミックスを「テストの合計数」でモデル化しているので、それぞれの仮想ユーザーは 30% の確率で "WebTest1" を実施し、70% の確率で "WebTest2" を実行します。また、その実行が終了すると、同じ確率でシナリオの選択を行いテストを実行する、といった動作となります。
図 5.15
次に実際のユーザーが使用するであろうネットワーク環境を元に、仮想ユーザーとサーバーとの間のネットワーク帯域の選択を行います。今回はデフォルトのまま (100% のユーザーが LAN でアクセスする) で結構ですので「次へ」をクリックしてください。
図 5.16
次にユーザーが使用するブラウザー環境の選択を行います。こちらも今回はデフォルトのまま (100% のユーザーが IE9 でアクセスする) で結構ですので「次へ」をクリックしてください。
図 5.17
次にロード テスト実行中に監視を行うコンピューターの指定を行います。デフォルトで、「コントローラー コンピューター」および「エージェント コンピューター」の項目があります。これらは実際に負荷テストを行う際に、仮想ユーザーを発生させるためのコンピューターとなります。通常はこれらのテストを行う側のサーバーとは別に、テスト対象となるサーバー (Web アプリケーションを稼働させるサーバー) が存在することになりますので、そのサーバーの情報を追加します。今回はハンズオン ラボの実施のため、テスト対象となるサーバー (Web アプリケーション サーバー) とテストを行う側のサーバー (仮想ユーザーにより負荷を発生させるサーバー) を同一 PC で行っているため、監視対象の追加を行わず、「次へ」をクリックします。
図 5.18
※ 開発プロジェクトにおいて、実際の運用環境を想定してのテストを行う場合などは、テスト対象となるサーバーと、テストを行う側のサーバーは必ず分離するようにしてください。負荷テスト実施時にはテストを行う側のサーバー (仮想ユーザーとして、Web アプリケーションに HTTP Request を送る側のサーバー) においてもテスト実行のためのリソースが必要となりますので、同一のサーバーで実施してしまうとパフォーマンス上のボトルネックが現出された際に、開発を行っている Web アプリケーションの問題なのか、テストを行う側の問題なのかの切り分けが難しくなります。テスト対象とテストを行う側のサーバーを分離することで、ボトルネック発生時の問題切り分けが容易になり、精度の高いテスト実施が可能になります。
最後にロード テストの実行設定として、どのくらいの時間の長さで負荷テストを行うか (あるいは何回行うか) を指定します。今回はデフォルトのまま (10 分間持続する) テストを実行する、として「完了」を押します。
図 5.19
以上でロード テストの作成は終了です。次にロード テストの実行を行う前に、2 つ目のハンズオンで行った Web パフォーマンス テストに関する設定を元に戻したいとおもいます。ソリューション エクスプローラーにおいて Local.testsetting ファイルを右クリックし、表示されたメニューから「開く」を選択します。
図 5.20
表示されたメニューにおいて「Web テスト」のタブを開き、実行のプロパティを「固定された実行数」に変更し、「適用」を行った後に「閉じる」をクリックします。
図 5.21
手順 15 までの作業で作成されたロード テストの定義 LoadTest1.loadtest において、三角フラスコのメニューを展開し、[ロード テストの実行] を行います。
図 5.22
以下のようにロード テストによる負荷状況が表示されます。今回は「ステップ ロード」を選択しているので、"User Load" (4 つあるグラフのうち左上のグラフにおいて右上がりになっている赤色のグラフ) が徐々に高まっているのがわかります。一方でページの応答時間のデータ (右上のグラフ) はほぼゼロに近いエリアを横ばい状態でキープしていることが確認できます。
図 5.23
※ テストによる実行状況、結果は、テストを実施いただく環境により異なります。
テストが終了すると、各ページ毎の平均応答時間やテスト実施においてアクセスされた回数等、以下のようなテスト結果の概要が表示されます。
図 5.24
また上部のタブにおいて、[グラフ] を選択することで、カウンターごとの詳細な情報を確認することが可能です。
図 5.25
負荷テスト実施時にエラーが起こった際には、そのエラー情報やこれらのカウンター情報により、ボトルネックの発見に役立てることが可能です。
このように Visual Studio の負荷テスト機能を利用すると、多数のユーザーによりアクセスが行われた際にもアプリケーションが正しく動くのか、期待通りの応答時間で返答を行うことができるのか、何名程度のユーザーアクセスに耐えることができるのか、といったことを検証することが可能です。
ここでは以上で 3 つ目のハンズオンを終了します。
3 つ目のハンズオンでは、Visual Studio を使った負荷テストについて学びました。
- (1) 負荷テストの作成
- (ア) 負荷テストの分類 (狭義の負荷テストとストレス テスト)
- (イ) ウィザードによるロード テストの作成
- (2) ロード テストの実行と結果の確認