「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次  †
概要  †
負荷テストとは?  †
負荷テストの概要図  †
単純に、Webアプリケーションだけに対して負荷をかけることもできるが、
以下のようにネットワーク機器など含めた本番稼働構成に対する性能検証も可能。
この場合、単純なリクエスト-レスポンス間の時間測定だけするのではなく、
各サーバーや機器のパフォーマンス カウンタなどのパフォーマンス情報を収集し、
ボトルネックが無いか?などを調査する必要がある。
負荷テストのスクリプト作成  †
- 負荷テストでは、以下のような実行毎に変わる可変値を
正規表現などを使用して抜いて引き継ぐ処理が必要になるケースがある。
以降コレを「可変値の追跡」と呼ぶ。
 
- また、ユーザ入力やユーザ操作をシミュレートする必要になるケースもある。
 
可変値の場所  †
- ヘッダ
- Cookie
- Session Cookie
 
- Cookie認証チケット
 
 
 
可変値のユースケース  †
- 実行タイミング次第で可変となる値。
 
- ランダム値が使用されていて可変となる値。
 
- 乱数
- GUID, UUID
 
- Temporary Password
 
 
- DBMSの
- Timestamp値
 
- Identity列やSequence値
 
 
- ログイン・ユーザ毎に可変となる値。
- ログイン・アカウント
 
- ユーザ毎の結果セット
 
- 結果セットから選択したデータ
 
 
スクリプトによる可変値の追跡  †
アプリケーションの仕組み次第では、データストアを初期化すれば、
取得した電文の再送だけで、負荷テストが可能なケースもあるが、
- 実行タイミング次第で可変となる値がある。
 
- ランダム値が使用されていて可変となる値がある。
 
- 多重ログインが不可能
 
のような処理がある場合、「可変値の追跡」必要になる。
このため、負荷テストでは、スクリプト作成が必要になる。
このように「可変値の追跡」が必要になる負荷テストは、HTTPを使用するWebアプリケーションでは容易であるが、
バイナリ電文を使用するリッチクライアントの場合、型情報を取り込む必要があるので、容易ではない。
(...と言うか、実質的に汎用的な負荷ツールでバイナリ電文の実行で負荷をシミュレートできないことが殆どである)。
負荷テスト・ツールの機能  †
負荷テスト・ツールは、以下のような機能を持っている。
電文のキャプチャとスクリプトの生成機能  †
- 電文キャプチャとスクリプト(修正前のテンプレート)を生成する。
 
- 専用ブラウザを持つツールと、HTTPプロキシのように動作するツールがある。
 
HTTPプロキシのように動作するツール  †
- GUIを持たないWebAPIの負荷テストの場合は、コチラを使用する必要がある。
 
専用ブラウザを持つツール  †
- レグレッション・テスト(回帰テスト)を実行可能。
- この場合、ブラウザ上の操作手順やjavascriptなどのイベントをシミュレートできる。
 
- ただし、レグレッション・テスト(回帰テスト)用であり、
負荷テスト用のスクリプト再生には使用できない。 
 
- また、スクリプトを再実行して
「スクリプト(操作)の記録時」と、「テスト時」の
値の差異を検出し、追跡が必要な可変値をサジェストする。 
スクリプトの編集機能  †
- 可変値を追跡する。
 
- 準備したユーザ毎の入力値を、実行時に投入する。
 
仮想ユーザ毎のスクリプト実行機能  †
- 仮想ユーザ毎にスクリプトを実行する。
 
- 多重度を上げるため、1 Thread = 1 Userに見立てて負荷をシミュレートする。
 
- この際、ユーザ入力の思考遅延時間をシミュレートする。
 
シナリオの組み立てと実行機能  †
- シナリオでは、複数のスクリプトを組合せて本番環境に近い負荷をシミュレートする。
 
- このシナリオを組み立て、シナリオに従い仮想ユーザ毎にスクリプトを実行させる。
 
アーキテクチャと負荷テスト  †
Webアプリケーション(+HTTP)  †
HTTPはHeaderからBodyまで、全てテキスト表現となっているため、以下手順に従い、
負荷テスト・ツールを用いてスクリプトを作成し負荷テスト・シナリオを作成しやすい。
- Webアプリケーションをブラウザから操作しながら、
HTTP電文をキャプチャしてスクリプトを生成する。 
- 作成したスクリプトを実行し、
アプリケーションが動作する(負荷をシミュレートできる)かを確認する。 
- アプリケーションが動作しない(負荷をシミュレートできない)部分を確認し、スクリプトの修正を行う。
- 動的に変更される可変値の追跡を行う。
 
- ユーザ入力をシミュレートする。
例えば、多重ログインができないシステムであれば、
仮想ユーザごとに使用するユーザIDを変更するようにする。 
 
- スクリプトを実行して、サーバーに負荷をかける。
 
- スクリプトを組合せ負荷テスト・シナリオを作成し実行する。
 
リッチクライアント(+バイナリ電文)  †
バイナリ電文  †
- バイナリ電文はC構造体や.NETオブジェクトのバイナリ表現になっている事が多い。
 
- このため、バイナリ電文を使用するリッチクライアントの負荷テストは、
HTTPに特化した負荷テストツールでは実行が困難である。 
- バイナリ電文の負荷テストが困難な理由は、
- 電文再送で負荷がかけられるような単純なサーバー機能でない限り、バイナリ電文は型情報が無いと上手く処理できない。
 
- 殆どのビジネス・アプリケーションでは、その仕組み上、単純なバイナリの電文再送では負荷をシミュレートできない事が多い。
 
 
等である。
- 結果として、バイナリ電文を使用するリッチクライアントの負荷テストは、
クライアントサイドのシミュレータやスクリプトなどを開発して負荷をシミュレートする事が多い。 
回帰テストツール  †
以下のような、回帰テストツールもあるが、
負荷テストは、多重実行など、回帰テストツールでの代替が難しいため、
同様にクライアントサイドのシミュレータやスクリプトを作成して再生することが多い。
3層 C/S、2層 C/S  †
- 3層 C/Sの場合、
基本的にシミュレータやスクリプトを作成して負荷テストを実行する。
 
- P層 / B層(D層)が適切にクラス分割されていれば、
3層C/Sのようなシミュレータやスクリプトを作成しやすい。 
.NETの場合  †
Webアプリケーション  †
以下がポイントのもよう。
- HTTPクッキーマネージャを設定(Session利用時)
 
- EVENTVALIDATIONの引継を設定
EVENTVALIDATIONは、EnableEventValidation? = true の際に
生成され、PostBack?およびCallbackイベントを検証するための情報。
これにより、Response・PostBack?間で保存 → 復元される値が、
改ざんされていないかどうかをチェックするようになるので、
Response・PostBack?間で保存 → 復元される値が、
動的に変更になるような場合は、可変値を追跡する必要がある。
 
- CSRF(XSRF)対策用のTokenの引継を設定
 
- CSRF(XSRF)対策用のTokenの引継を設定
 
リッチクライアン  †
は、前述の方法を参考にする。
Tags: :テスト