2021/08/25
負荷テストのシナリオ作成方法を開発会社のプロが徹底解説
Hedgehogは管理画面で対象サイトへのアクセスをシナリオとして組み立てて多重リクエストを実行できます。お客様の要望に合わせて当社で「シナリオ作成」を代行することも多いため、どのように作成しているのかを説明します。
シナリオ作成のご相談はこちら
サイトのオーナー、PMが自分でシナリオを自由に記載することができると試験の実施も早いですし何より費用がかかりませんので、ぜひ参考にして頂ければと思います。
なお、ご契約していただいているお客様についてはHedgehogは無償で利用方法をサポートさせていただいております。
Slackチャンネルを開設して当社の技術者がすぐにその場で回答させていただくようなことも可能ですので、ぜひお客様でシナリオ作成にチャレンジして頂ければと思います!
自社で開発したシステムの場合は当然URIやパス、クエリの仕様などがわかっている場合が多く、お客様からAPIやサイトの仕様書をそのまま頂く場合もあります。(すでに開発時のドキュメントや資料もないのでわからない、というケースもありますが。。。)
仕様書がある場合はそのままHedgehogでシナリオを作成できます。
まずは一番の基本となるサイトの参照です。基準URLには環境のURIを指定します。
※ 負荷テストを行う場合、http:80かhttps:443にするべきかは色々な考え方がありますが、ケースバイケースとしておきます。本番サイトでSSLの使用が前提であり、実測値を計測したいという場合は同じ環境でテストしたほうが良いでしょう。ただし開発中やリリース前の、性能チューニングを伴う負荷テストでは、なるべくシンプルな構成とし、サーバーの性能以外でボトルネックとなる可能性や切り分けの邪魔になる要因を除外するべきです。
リクエストにはアクセスするパスを指定します。
シンプルですね。これでブラウザ上で
http://ec2-3-114-18-151.ap-northeast-1.compute.xxxxxxx.com/memberlogin/
へアクセスした場合と同じリクエストが実行できます。
これを500ユーザーとかで多重実行するだけでも負荷テストとしては成立します。脆弱なサーバーですと途中で5xx系のエラーが発生してサーバーが応答できなくなってしまう可能性があります。
次はちょっと難しい例です。APIでアカウント情報を取得するためのサンプルAPIに対してPOSTを実行する場合のシナリオの例です。
パスにはAPI仕様書通り /api/v1/authorize を指定しています。
「ボディ」のタブでフォームオブジェクトとしてクライアントIDとクライアントシークレットをPOSTするように指定しています。
正常に処理されればレスポンスにtokenが返却されます。
次にレスポンスタブで、JSONを指定し「選択してください」を開きます。以下のようなダイアログが出ますので、レスポンスのJSONを入力して「OK」を選択します。
これは仕様書からの抜粋でも良いですし、実際にAPIへアクセスしたときの戻り値をそのまま貼り付けても構いません。
「OK」を選択すると「セレクタ」のモードになります。
ここで次のリクエストで使いたいtokenの要素を選択すると以下のように選択できます。
これで /api/v1/authorize にPOSTしたときのレスポンスからAPIのアクセストークンを取得し
セッション変数に入れることができました。シナリオ内で利用する変数名はtokenとしています。
次のリクエストです。/api/v1/accout をGETします。HTTPヘッダに取得したtokenを埋め込んでリクエストする仕様になっています。
この場合は以下のようにシナリオを記載します。
CSRF(クロスサイトリクエストフォージェリ)という外部サイトからのリクエストを受信した場合にサーバーが意図せずに処理を受け付けてしまう攻撃への対策として、サイトのフォームにトークンを埋め込む場合があります。これはPOSTの送信元が同一のページ内からであることを保証するための仕組みです。
モダンなフレームワークだとフォームを設置してPOSTメソッドが実行される画面では自動でCSRFトークンが埋め込まれる場合もあります。その際にリクエストヘッダやフォームオブジェクトにページから取得したトークンを埋め込んでPOSTしないと正しくリクエストが実行されません。
この場合は以下のような設定を行います。以下はCSRF対策のコードが埋め込まれたサイトのフォームが設置されたページです。トークンがHTML内に埋め込まれていることがわかります。
<form action="/" name="inquiry" method="post" accept-charset="utf-8">
<input type="hidden" name="QoE2E62jhv7tzcR4" value="pgwVtv8YUP0ywIrVSDrxAvK6oEBrnTWD" />
上記のケースでは、シナリオ作成時に以下のように設定します。CSSセレクタを使って特定のタグ要素の値を変数に入れることができます。
この状態で実際にHedgehogのシナリオを実行すると、正しくフォームへのPOST処理が実行されることがわかります。
シナリオを無事に実行させた後は、チェックや応用の仕方も押さえておくことをおすすめします。
次回は
について解説したいと思います。