(57)【要約】例は負荷テストに関係する。本明細書に開示された例は、以下のことを可能にする。即ち、アプリケーションがクライアント・コンピューティング・デバイスで実行される際に記録されるコード行を取得し、コード行が実行の時間順に記録されており；少なくとも１つの変数への依存性がコード行の個々の行に存在するか否かを判断し；依存性が存在するという判断に応答して、依存性をデータ記憶装置に格納し；呼び出される変数を呼び出すネットワーク呼び出し文を含むコード行を、コード行から識別し；呼び出される変数およびデータ記憶装置に格納された依存性に基づいてコード行の第１のサブセットを除去し、除去後に残るコード行の第２のサブセットが、ユーザ入力されたパラメータ・データを含むこと。【選択図】図５
2018502390.tif 000002
【特許請求の範囲】
【請求項１】
負荷テストの方法であって、
アプリケーションがクライアント・コンピューティング・デバイスで実行される際に記録されるコード行を取得し、前記コード行が実行の時間順に記録されており、
少なくとも１つの変数への依存性が前記コード行の個々の行に存在するか否かを判断し、
前記依存性が存在するという判断に応答して、前記依存性をデータ記憶装置に格納し、
呼び出される変数を呼び出すネットワーク呼び出し文を含むコード行を、前記コード行から識別し、
前記呼び出される変数および前記データ記憶装置に格納された依存性に基づいて前記コード行の第１のサブセットを除去することを含み、前記除去後に残るコード行の第２のサブセットが、ユーザ入力されたパラメータ・データを含む、方法。
【請求項２】
前記依存性が前記コード行の個々の行に存在するか否かを判断するために、前記実行の時間順を上る方向に移行することにより、依存性分析を実施し、
前記依存性分析の結果に基づいて前記コード行の個々の行を除去するか否かを判断するために、前記ネットワーク呼び出し文を含むコード行から前記実行の時間順を下りる方向に移行することにより除去分析を実施することを更に含む、請求項１に記載の方法。
【請求項３】
前記コード行の制御フローグラフ（ＣＦＧ）を取得し、前記ＣＦＧが実行可能なコード・ブロック及び前記実行可能なコード・ブロック間の関係を定義し、
ユーザの前記アプリケーションとの相互作用の履歴に基づいて前記ＣＦＧのサブセットを判断することを更に含み、前記依存性分析および前記除去分析が前記ＣＦＧのサブセットに従って実施される、請求項２に記載の方法。
【請求項４】
前記呼び出される変数および前記データ記憶装置に格納された依存性に基づいて前記コード行の第１のサブセットを除去することが、
前記呼び出される変数が前記コード行の第１の行の少なくとも１つの変数に依存するか否かを、前記データ記憶装置に格納された前記依存性に基づいて判断し、
前記呼び出される変数が前記第１の行の少なくとも１つの変数に依存しないという判断に応答して、前記第１の行を除去し、
前記呼び出される変数が前記コード行の第２の行の少なくとも１つの変数に依存するか否かを、前記データ記憶装置に格納された前記依存性に基づいて判断し、
前記呼び出される変数が前記第２の行の少なくとも１つの変数に依存しないという判断に応答して、前記第２の行を除去することを更に含む、請求項１に記載の方法。
【請求項５】
前記ユーザ入力されたパラメータ・データがコード行の前記第２サブセットの残りの部分と視覚的に異なって表示されるように、コード行の前記第２のサブセットを提示することを更に含む、請求項１に記載の方法。
【請求項６】
前記コード行が、プログラミング言語の構文に基づいて正規化される、請求項１に記載の方法。
【請求項７】
コンピューティング・デバイスのプロセッサにより実行可能な負荷テスト用の命令を含む持続性機械可読記憶媒体であって、
クライアント・コンピューティング・デバイスのアプリケーションの実行中に記録されるコード行を取得するための命令と、
前記コード行の制御フローグラフ（ＣＦＧ）を取得するための命令と、
少なくとも１つの変数への依存性が前記コード行の各行に存在するか否かを判断するために、前記ＣＦＧの第１の方向に移行することにより依存性分析を実施するための命令と、
前記依存性分析の結果に基づいて、前記コード行の各行を除去するか否かを判断するために、前記ＣＦＧの第２の方向に移行することにより除去分析を実施するための命令とを含む、持続性機械可読記憶媒体。
【請求項８】
ユーザの前記アプリケーションとの相互作用を監視するための命令と、
前記監視されるユーザの相互作用に基づいて前記ＣＦＧを計算するための命令とを更に含む、請求項７に記載の持続性機械可読記憶媒体。
【請求項９】
前記依存性分析を実施している間に、呼び出される変数を呼び出すネットワーク呼び出し文を、前記コード行から識別するための命令と、
前記ネットワーク呼び出し文に基づいて前記除去分析をトリガするための命令とを更に含む、請求項７に記載の持続性機械可読記憶媒体。
【請求項１０】
前記除去分析を実施するための命令が、
前記依存性分析の結果に基づいて、前記呼び出される変数が前記コード行の所与の行における少なくとも１つの変数に依存するか否かを判断するための命令と、
前記呼び出される変数が前記所与の行における少なくとも１つの変数に依存しないという判断に応答して、前記所与の行を除去するための命令とを含む、請求項９に記載の持続性機械可読記憶媒体。
【請求項１１】
クライアント・コンピューティング・デバイス又はクライアント・コンピューティング・デバイスのブラウザに特有である文を含む前記コード行を変更するための命令を更に含む、請求項７に記載の持続性機械可読記憶媒体。
【請求項１２】
負荷テスト用のシステムであって、
プロセッサを含み、前記プロセッサが以下のこと、即ち
クライアント・コンピューティング・デバイスにおけるアプリケーションの実行中に記録されるコード行を取得し、前記コード行が前記実行の時間順に記録されており、
少なくとも１つの変数への依存性が前記コード行の各行に存在するか否かを判断するために前記時間順の第１の方向に移行することにより依存性分析を実施し、
前記依存性が存在するという判断に応答して、前記依存性をデータ記憶装置に格納し、
前記データ記憶装置に格納された依存性に基づいて前記コード行の各行を除去するか否かを判断するために、前記時間順の第２の方向に移行することにより除去分析を実施し、
前記除去分析後に残るコード行のサブセットの表示をもたらすことを行い、前記コード行のサブセットがユーザ入力されたパラメータ・データを含み、前記ユーザ入力されたパラメータ・データが前記コード行のサブセットの残りの部分から視覚的に異なって表示される、システム。
【請求項１３】
前記コード行のサブセットの表示をもたらすことが、
前記コード行のサブセットにおいて前記ユーザ入力されたパラメータ・データを検出し、
前記検出されたユーザ入力されたパラメータ・データを示す、前記コード行のサブセットの部分を強調表示することを更に含む、請求項１２に記載のシステム。
【請求項１４】
前記プロセッサが、
前記コード行の制御フローグラフ（ＣＦＧ）を決定し、前記ＣＦＧが、第２の実行可能なコード・ブロックに接続される第１の実行可能なコード・ブロックを含む実行可能なコード・ブロックを定義し、前記依存性分析および除去分析が前記ＣＦＧに基づいて実施される、請求項１２に記載のシステム。
【請求項１５】
前記第１の実行可能なコード・ブロックが、コード行の第１のセットを含み、前記第２の実行可能なコード・ブロックが、コード行の第２のセットを含み、前記プロセッサが、
前記コード行の前記第１のセットから前記コード行の前記第２のセットまで移行することにより前記依存性分析を実施し、
前記コード行の前記第２のセットから前記コード行の前記第１のセットまで移行することにより前記除去分析を実施する、請求項１４に記載のシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
背景
負荷テストは、トラフィックのような負荷状況をシミュレートしながら、アプリケーションのインテグリティ（整合性、完全性）及び性能を検証（確認）する手法である。ウェブ・アプリケーションのようなアプリケーションの負荷テストを実施するために、テスト・スクリプトは、アプリケーションの実行と関連したトラフィック動作（behavior：挙動、振舞い）をシミュレートするために生成され得る。
【０００２】
以下の詳細な説明は、図面を参照する。
【図面の簡単な説明】
【０００３】
【図１】様々な例が負荷テスト・システムとして実施され得る例示的な環境を示すブロック図である。
【図２】例示的な負荷テスト・システムを示すブロック図である。
【図３】負荷テスト用のプロセッサにより実行可能な命令を含む例示的な機械可読記憶媒体を示すブロック図である。
【図４】負荷テスト用のプロセッサにより実行可能な命令を含む例示的な機械可読記憶媒体を示すブロック図である。
【図５】負荷テスト用の例示的な方法を示す流れ図である。
【図６】負荷テスト用の例示的な方法を示す流れ図である。
【図７】例示的な制御フローグラフ（ＣＦＧ）を示す図である。
【図８】第１のＣＦＧに基づいて実施される例示的な依存性分析および削除分析を示す図である。
【図９】第２のＣＦＧに基づいて実施される例示的な依存性分析および削除分析を示す図である。
【０００４】
詳細な説明
以下の詳細な説明は、添付図面を参照する。可能な限り、同じ参照番号が、同じ又は類似の部品を参照するために図面および以下の説明において使用される。しかしながら、特に理解されるべきは、図面は例示および説明のためだけである。幾つかの例が本明細書において説明されるが、変更、改変および他の具現化形態が可能である。従って、以下の詳細な説明は、開示された例を制限しない。それよりむしろ、開示された例の適切な範囲は、添付の特許請求の範囲により定義され得る。
【０００５】
テスト・スクリプトは、機械可読命令および変数を含むことができ、アプリケーションの動作を記録することに基づいて生成され得る。スクリプトは、アプリケーションの実行と関連した動作をシミュレートするために再現（リプレイ）され得る。幾つかの例において、アプリケーションは、サーバ・コンピューティング・デバイス上で実行され得る。アプリケーションは、ユーザ（及び対応するクライアント・コンピューティング・デバイス）によりアクセス可能なウェブ・アプリケーション又は他のタイプのアプリケーションとすることができる。
【０００６】
幾つかの具現化形態において、スクリプトは、アプリケーションの実行と関連したトラフィック動作をシミュレートするために使用されるトランスポート・スクリプトとすることができる。アプリケーションの実行と関連したトラフィックは、アプリケーションの様々な実行と共に変化するデータに関係することができる動的データを含むことができる。スクリプトを作成するために、実行中にアプリケーションと関連したトラフィックは、監視されて動的データを識別するために分析され得る。次いで、動的データは、ターゲット・タスクを実施するために再現され得るスクリプトを生成するために使用され得る。係るトランスポート・スクリプトの再現は、動的データの動作（behavior：挙動、振舞い）を含む、シミュレートされるべきアプリケーションの実行と関連したトラフィック動作を可能にする。
【０００７】
スクリプトを再現することに基づいて実施され得るタスクの例には、負荷テスト、アプリケーション・プログラミング・インターフェース（ＡＰＩ）のテスト、又は幾つかの他のタイプのテストのようなテスト・タスクが含まれる。
【０００８】
負荷テストは、トラフィックのような負荷状況をシミュレートしながら、アプリケーションのインテグリティ（整合性、完全性）及び性能を検証（確認）する手法である。ウェブ・アプリケーションのようなアプリケーションの負荷テストを実施するために、スクリプトは、アプリケーションの実行と関連したトラフィック動作（behavior：挙動、振舞い）をシミュレートするために生成され得る。より安定している（robust：堅固な）スクリプトを提供するために、アプリケーションの複数の実行インスタンスと関連したトラフィックが、スクリプトの作成で用いる動的データ（例えば、相関データ、パラメータ・データ、及び他のタイプの動的データ）を識別するために監視および分析され得る。アプリケーションの「実行インスタンス」は、リクエスタ（要求元）により呼び出される際のアプリケーションのインスタンスを意味することができる。場合によっては、アプリケーションの多数（例えば、１００以上）の実行インスタンスが監視され得る。更に、複数のアプリケーションのインスタンスが監視され得る。１つ又は複数のアプリケーションの実行インスタンスと関連した監視されるトラフィックに基づいて、各アプリケーションと関連した動的データが識別されることができ、係る識別された動的データは、トランスポート・スクリプト（単数または複数）のようなスクリプト（又は複数のスクリプト）を作成するために使用され得る。
【０００９】
動的データは、クライアント・コンピューティング・デバイスとサーバ・コンピューティング・デバイスのアプリケーションとの間の相互作用中に、サーバ・コンピューティング・デバイス（例えば、図１のサーバ・コンピューティング・デバイス１３０）により生成され、クライアント・コンピューティング・デバイス（例えば、図１のクライアント・コンピューティング・デバイス１４０）に伝えられるデータを意味する「相関データ」を含むことができる。クライアント・コンピューティング・デバイスに提供されるこのサーバで生成されたデータは、特定の通信をアプリケーションの所与のインスタンスと関連付けるためにサーバ・コンピューティング・デバイスにより使用可能なデータとすることができる。一例として、相関データは、クライアント・コンピューティング・デバイスとサーバ・コンピューティング・デバイスのアプリケーションとの間の特定のセッションを識別するために、セッション識別子を含むことができる。他の例において、通信の流れに関連する他の識別子が使用され得る。更なる例として、相関データは、クライアント・コンピューティング・デバイスがアプリケーションとの後続の通信のために認証データを使用することを可能にするためにサーバ・コンピューティング・デバイスにより生成されてクライアント・コンピューティング・デバイスに伝えられる認証データを含むことができる。
【００１０】
動的データは、クライアント・コンピューティング・デバイス（例えば、クライアント・コンピューティング・デバイスのブラウザ）において、ユーザ入力されたデータを意味する「パラメータ・データ」を含むことができる。例として、ユーザ入力されたデータは、検索エンジンのクエリー・ボックスへ入力された検索語を含むことができる。例えば、アプリケーションは、情報を検索するためにクライアント・コンピューティング・デバイスからアクセス可能な検索アプリケーションである。他の例として、ユーザ入力されたデータは、登録プロセス中または他のプロセス中のような、フォームへ入力されたデータを含むことができる。ユーザ入力されたデータは、クライアント・コンピューティング・デバイスからサーバ・コンピューティング・デバイスへ伝えられる。
【００１１】
かくして、パラメータ・データは、クライアント・コンピューティング・デバイスから出ているデータを識別することにより発見されることができ、この場合、データの値は、同じアプリケーションの異なる実行インスタンスの間で変化する。幾つかの例において、辞書が構築されることができ、この場合、辞書は、パラメータ及び対応する異なる値を含むことができる。辞書は、スクリプトを構築する際に、後でアクセスされ得る。
【００１２】
アプリケーションの複数の実行インスタンスのために生成される膨大な量のトラフィック・データの故に、トラフィック・データにおいて動的データを正確に識別することは技術的な課題であり、多大な時間を必要とする可能性がある。
【００１３】
本明細書に開示された例は、アプリケーションがクライアント・コンピューティング・デバイスにおいて実行される際のコード行を記録し、コード行の無関係な部分を取り除くために記録されたコード行を分析し、コード行における動的データがより容易に識別可能となることを可能にすることにより、これら技術的課題に対して技術的解決法を提供する。本明細書に開示された例は、以下のことを可能にする。即ち、アプリケーションがクライアント・コンピューティング・デバイスで実行される際に記録されるコード行を取得し、当該コード行が実行の時間順に記録されており；少なくとも１つの変数への依存性がコード行の個々の行に存在するか否かを判断し；依存性が存在するという判断に応答して、当該依存性をデータ記憶装置に格納し；呼び出される変数を呼び出すネットワーク呼び出し文を含むコード行を、コード行から識別し；当該呼び出される変数およびデータ記憶装置に格納された依存性に基づいてコード行の第１のサブセットを除去し、除去後に残るコード行の第２のサブセットが、ユーザ入力されたパラメータ・データを含むこと。
【００１４】
本明細書で使用される用語は、特定の実施形態を説明するためだけであり、制限することを意図されていない。本明細書で使用される限り、単数形の「a」、「an」及び「the」は、文脈上明白に別段の指示がない限り、同様に複数形を含むことが意図されている。本明細書で使用される限り、用語「複数」は、２つ又は２つより多いように定義される。本明細書で使用される限り、用語「別の」は、少なくとも第２の又はそれより多いように定義される。本明細書で使用される限り、用語「結合された」は、別段の指示がない限り、何らかの介在要素を用いずに直接的であろうと少なくとも１つの介在要素を用いて間接的であろうと、接続されるように定義される。２つの要素は、機械的に結合され、電気的に結合され、又は通信チャネル、経路、ネットワーク又はシステムを介して通信可能にリンクされ得る。本明細書で使用される限り、用語「及び／又は」は、１つ又は複数の関連する列挙されたアイテムの任意の及び全ての考えられる組み合わせを意味し且つ包含する。また、理解されるべきは、用語「第１」、「第２」、「第３」などは、本明細書において様々な要素を説明するために使用され得るが、これら要素は、これら用語によって制限されるべきではなく、その理由はこれら用語が、特に明記しない限り又は文脈上明白に別段の指示がない限り１つの要素を別の要素から区別するためだけに使用されているからである。
【００１５】
図１は、様々な例が負荷テスト・システム１１０として実施され得る例示的な環境１００である。環境１００は、サーバ・コンピューティング・デバイス１３０及びクライアント・コンピューティング・デバイス１４０（１４０Ａ、１４０Ｂ、・・１４０Ｎとして示される）を含む様々な構成要素を含むことができる。各クライアント・コンピューティング・デバイス１４０Ａ、１４０Ｂ、・・１４０Ｎは、サーバ・コンピューティング・デバイス１３０に要求を伝える及び／又はサーバ・コンピューティング・デバイス１３０から応答を受け取ることができる。サーバ・コンピューティング・デバイス１３０は、クライアント・コンピューティング・デバイス１４０からの要求を受け取る及び／又は当該要求に応答することができる。クライアント・コンピューティング・デバイス１４０は、ユーザがソフトウェア・アプリケーションと相互作用することができるユーザ・インターフェースを提供する任意のタイプのコンピューティング・デバイスとすることができる。例えば、クライアント・コンピューティング・デバイス１４０は、ラップトップ型コンピューティング・デバイス、デスクトップ型コンピューティング・デバイス、一体型コンピューティング・デバイス、タブレット型コンピューティング・デバイス、携帯電話、電子ブック・リーダ、「スマート」テレビのようなネットワーク対応の電化製品、及び／又はユーザ・インターフェースを表示して、表示されたインターフェースでもってユーザの相互作用を処理するのに適した他の電子デバイスを含むことができる。サーバ・コンピューティング・デバイス１３０は単一のコンピューティング・デバイスとして示されるが、サーバ・コンピューティング・デバイス１３０は、クライアント・コンピューティング・デバイス１４０による消費のための少なくとも１つのソフトウェア・アプリケーションに仕える任意の数の統合型または分散型コンピューティング・デバイスを含むことができる。
【００１６】
図１に示された様々な構成要素（例えば、構成要素１２９、１３０、及び／又は１４０）は、ネットワーク５０を介して少なくとも１つの他の構成要素に結合され得る。ネットワーク５０は、構成要素間の電子通信を可能にする任意のインフラストラクチャー又はインフラストラクチャーの組み合わせを含むことができる。例えば、ネットワーク５０は、インターネット、イントラネット、ＰＡＮ（パーソナル・エリア・ネットワーク）、ＬＡＮ（ローカルエリア・ネットワーク）、ＷＡＮ（広域ネットワーク）、ＳＡＮ（ストレージ・エリア・ネットワーク）、ＭＡＮ（都市規模ネットワーク）、無線ネットワーク、セルラー通信ネットワーク、公衆交換電話網、及び／又は他のネットワークの少なくとも１つを含むことができる。様々な具現化形態に従って、本明細書で説明される負荷テスト・システム１１０及び様々な構成要素は、ハードウェア及び／又はハードウェアとハードウェアを構成するプログラミングの組み合わせで実施され得る。更に、図１及び本明細書で説明される他の図面において、示されたものと異なる数の構成要素またはエンティティが使用され得る。
【００１７】
負荷テスト・システム１１０は、コード取得エンジン１２１、制御フロー・エンジン１２２、依存性分析エンジン１２３、除去分析エンジン１２４、デバイス特定コード変更エンジン１２５、ディスプレイ・エンジン１２６、及び／又は他のエンジンを含むことができる。本明細書で使用される限り、用語「エンジン」は、指定された関数（機能）を実行するハードウェア及びプログラミングの組み合わせを意味する。図３〜図４に関して示されるように、各エンジンのハードウェアは例えば、プロセッサ及び機械可読記憶媒体の一方または双方を含むことができるが、プログラミングは、機械可読記憶媒体に格納され且つ指定された関数を実行するためにプロセッサにより実行可能な命令またはコードである。
【００１８】
コード取得エンジン１２１は、クライアント・コンピューティング・デバイス１４０でのアプリケーションの実行中に記録されるコード行を取得することができる。コード取得エンジン１２１は、アプリケーションの実行インスタンスと関連したトラフィックを監視および／または記録することができる。例えば、コード行は、ウェブ・アプリケーション（例えば、サーバ・コンピューティング・デバイス１３０に常駐する）がクライアント・コンピューティング・デバイス１４０のウェブ・ブラウザで実行される際に記録され得る。ユーザがウェブ・ブラウザを介してウェブ・アプリケーションと相互作用する際、ユーザのアクション（例えば、グラフィカル・ユーザー・インターフェース（ＧＵＩ）要素のクリック、フォームに記入など）及び／又は係るユーザのアクションに応じてなされる任意の関数呼び出しが記録され得る。コード行は、アプリケーションの単一の実行インスタンス及び／又はアプリケーションの複数の実行インスタンスに関して記録され得る。当該技術において知られている任意の記録技術を用いて、本明細書で説明されるような記録を実施することができる。コード行は、実行の時間順に記録され得る。記録されたコード行は、異なる順序で配列され得るか、又はそうでなければ変更され得る。
【００１９】
幾つかの具現化形態において、記録されたコード行は、特定のフォーマット（例えば、特定のプログラミング言語の構文）へ正規化され得る。例えば、記録されたコード行が「ａ＝ｂ＋ｃ＋ｄ」のようなコード行を含む場合、正規化は、特定のプログラミング言語の構文に応じて、それを「ａ＝ｂ＋ｃ」及び「ａ＝ａ＋ｄ」のような２つの別個の文へ分割することができる。当該技術において知られている任意の正規化技術を用いて、本明細書で説明されるような正規化を実施することができる。
【００２０】
制御フロー・エンジン１２２は、コード行（例えば、コード取得エンジン１２１により取得された）の制御フローグラフ（ＣＦＧ）を決定および／または取得することができる。本明細書で使用される限り、「ＣＦＧ」は、アプリケーションの実行中にアプリケーションを介して横断され得る全ての経路の、図表注釈を用いた表現を意味することができる。例示的な制御フローが図７に示される。ＣＦＧは、実行可能なコード・ブロック及び／又は実行可能なコード・ブロック間の関係を定義することができる。ＣＦＧにおいて、グラフの各ノードは、実行可能な「ブロック」を表すことができ、それは、任意のジャンプ（飛越し）のターゲット（例えば、ブロックを開始する）及びジャンプ（例えば、ブロックを終了する）を備えない直線的コードの部分を意味することができる。ＣＦＧにおいて方向付けられた端部（エッジ）は、実行可能なコード・ブロック間の関係を表すために及び／又は制御フローのジャンプを表すために使用され得る。
【００２１】
図７に示された例において、ブロック７２１〜７２５は、個々の実行可能なコード・ブロックを表すことができる一方で、記録されたコード行は図７の行１〜８を含むことができる。実行可能なコード・ブロック７２１〜７２５間の関係は、図７に示された方向付けられた端部（例えば、実行可能なブロックを接続する矢印線）により表され得る。
【００２２】
幾つかの具現化形態において、制御フロー・エンジン１２２は、アプリケーションとのユーザ相互作用の履歴に基づいてＣＦＧのサブセットを決定することができる。言い換えれば、ＣＦＧは、アプリケーションとの過去のユーザ相互作用に基づいて変更され得る。例えば、ユーザ（又はユーザのグループ）が、ウェブ・ブラウザを介してウェブ・アプリケーションと相互作用しながら、特定のＧＵＩ要素をクリックしない又は頻繁に（例えば、所定の頻度値の閾値未満）クリックしない場合、対応するコード行、実行可能なコード・ブロック、及び／又は方向付けられた端部は、ＣＦＧのサブセットを残して、ＣＦＧから取り除かれ得る。図７に示された例を用いて、実行可能なブロック７２３が、行５のコードを実行するために特定のＧＵＩボタンのユーザのクリックを必要とする「ＩＦ」文を表すと仮定する。そのユーザのアプリケーションとの相互作用（及び／又は複数のユーザのアプリケーションとの相互作用）の（例えば、特定の時間期間の）履歴は、ＧＵＩボタンがクリックされなかった（又は制御フロー・エンジン１２２により設定された所定の状況に応じて頻繁にクリックされなかった）ことを示すことができる。この例において、制御フロー・エンジン１２２は、実行可能ブロック７２１、７２２、７２４及び７２５、並びにこれら残りのブロックを接続する対応する方向付けられた端部を残して、ＣＦＧから実行可能ブロック７２３（及び実行可能ブロック７２３に接続された方向付けられた端部）を取り除くことにより、ＣＦＧを変更することができる。
【００２３】
制御フロー・エンジン１２２により決定および／または得られたようなＣＦＧ（又はＣＦＧのサブセット）は、依存性分析エンジン１２３及び除去分析エンジン１２４に関して本明細書で説明されるように、依存性分析および／または除去分析を実施するために使用され得る。
【００２４】
依存性分析エンジン１２３は、少なくとも１つの変数への依存性がコード行の各行に存在するか否かを判断するために、時間順の第１の方向に移行することにより依存性分析を実施することができる。第１の方向は、実行の時間順を上る方向を表すことができる。
【００２５】
図８に示された例は、「sendUser」と名付けられた関数を示す。依存性分析エンジン１２３は、少なくとも１つの変数への依存性が存在するか否かを、個々の行に関して判断するために、実行可能ブロック８１０の一番上の行から実行可能ブロック８１０の最も下の行まで移行することができる。この例において、依存性分析エンジン１２３は、最初の３つの行、即ち「user={name:'Joe'}」、「a=5」、及び「b=getUIValue('usesrnameField')」に依存性がないことを判断することができる。例えば、これら行は、変数「user」が'Joe'の「name」値を有し、変数「a」が５の値を有し、且つ変数「b」が'usesrnameField'と呼ばれるUIフィールドからの値を有することを単に表している。依存性分析エンジン１２３は、次の行へ移行する及び／又は変数「user2」が変数「user」に依存することを判断することができる。依存性が存在するという判断に応じて、依存性分析エンジン１２３は、データ記憶装置（例えば、データ記憶装置１２９）に依存性（例えば、変数「user2」が変数「user」に依存すること）を格納することができる。同様に、依存性分析エンジン１２３は、次の行へ移行する及び／又は変数「user」の名前が変数「b」に依存することを判断することができる。この依存性は、データ記憶装置１２９に格納され得る。同様に、依存性分析エンジン１２３は、次の行へ移行する及び／又は変数「user3」が変数「user2」に依存することを判断することができ、それはデータ記憶装置１２９に格納され得る。
【００２６】
幾つかの具現化形態において、依存性分析は、ＣＦＧ（又は制御フロー・エンジン１２２に関して本明細書で説明されるようなＣＦＧのサブセット）の第１の方向に移行することにより実施され得る。図８は、単一の実行可能ブロック（例えば、ブロック８１０）が存在する第１のＣＦＧに基づいて実施された例示的な依存性分析を示す。図９は、異なる（又は第２の）ＣＦＧに基づいて実施された例示的な依存性分析を示し、この場合if-else文を含む３つの実行可能ブロック（例えば、ブロック９１０〜９１２）が存在する。幾つかの具現化形態において、依存性分析は、ブロック９１０のコード行の第１のセットからブロック９１１のコード行の第２のセットまで、及び／又はブロック９１０のコード行の第１のセットからブロック９１２のコード行の第３のセットまで移行することにより実施され得る。
【００２７】
除去分析エンジン１２４は、データ記憶装置１２９に格納された依存性に基づいてコード行の各行を除去するか否かを判断するために、時間順の第２の方向に移行することにより除去分析を実施することができる。第２の方向は、実行の時間順を下りる方向を表すことができる。
【００２８】
幾つかの具現化形態において、除去分析は、コード行のネットワーク呼び出し文に基づいてトリガされ得る。ネットワーク呼び出し文は、依存性分析が時間順の第１の方向に移行することにより実施されている間に識別され得る。ネットワーク呼び出し文が識別される場合、除去分析エンジン１２４が、識別されたネットワーク呼び出し文を含むコード行から反対の方向（例えば、第２の方向）に移行し始めて除去分析を実施することができる。
【００２９】
図８に示された例を用いて、ネットワーク呼び出し文は、「sendToServer(user2)」を含む行に見出され得る。除去分析エンジン１２４は、識別されたネットワーク呼び出し文を分析および／または変数「user2」がネットワーク呼び出し文により呼び出されていることを判断することができる。除去分析は、「sendToServer(user2)」を有するコード行から第２の方向に移行することにより実施され得る。そのように行う際、除去分析エンジン１２４は、データ記憶装置１２９に格納された依存性に基づいて、呼び出される変数「user2」がコード行の各行において少なくとも１つの変数に依存するか否かを判断することができる。
【００３０】
図８の実行可能ブロック８２０は、除去後のコード行を示し、この場合、除去された行は取り消し線を引いている。行「user3=user2」は、呼び出された変数「user2」がこの行の何らかの変数に依存しないので、除去された。言い換えれば、この行は、呼び出された変数「user2」を変更しない又は変数「user2」に影響を及ぼさない。その一方で、行「uesr.name=b」は除去されない。その理由は、データ記憶装置１２９に格納された依存性に基づいて、呼び出された変数「uesr2」が変数「uesr.name」及び変数「b」に依存するからである。例えば、依存性は、変数「uesr.name」がどの値を有するか及び／又は変数「b」がどの値を有するか（例えば、「user2=user」ここで「user={name:'Joe'}」及び「user.name=b」）に基づいて、呼び出された変数「user2」が変更されることを示す。行「user2=user」は、呼び出された変数「user2」がこの行の変数「user」に依存するので、除去されない。行「b=getUIValue('usernameField')」は除去されない。その理由は、呼び出された変数「user2」が変数「b」（例えば、「user2=user」ここで「user={name:'Joe'}」及び「user.name=b」）に依存するからである。しかしながら、行「a=5」は除去される。その理由は、呼び出された変数「user2」が、データ記憶装置１２９に格納された依存性に従って、変数「a」に依存しないからである。行「user={name:'Joe'}」は除去されない。その理由は、呼び出された変数「user2」が、行「user2=user」と関連する依存性で示されたように変数「user」に依存するからである。
【００３１】
幾つかの具現化形態において、除去分析は、ＣＦＧ（又は制御フロー・エンジン１２２に関して本明細書で説明されるようなＣＦＧのサブセット）の第２の方向に移行することにより実施され得る。図８は、単一の実行可能ブロック（例えば、ブロック８２０）が存在する第１のＣＦＧに基づいて実施された例示的な除去分析を示す。図９は、異なる（又は第２の）ＣＦＧに基づいて実施された例示的な除去分析を示し、この場合if-else文を含む３つの実行可能ブロック（例えば、ブロック９２０〜９２１）が存在する。除去分析は、ブロック９２２のコード行の第３のセットからブロック９２０のコード行の第１のセットまで、及び／又はブロック９２１のコード行の第２のセットからブロック９２０のコード行の第１のセットまで移行することにより実施され得る。留意すべきは、図８の例において除去された行「a=5」は図９の例において除去されていない。これは、状況「ｘ」が満たされる（ブロック９２１を参照）場合に呼び出された変数「user2」が変数「a」に依存することをデータ記憶装置１２９に格納された依存性が示すからである。
【００３２】
デバイス特定コード変更エンジン１２５は、クライアント・コンピューティング・デバイス１４０及び／又はクライアント・コンピューティング・デバイス１４０のブラウザに特有であるコード文を含むコード行を変更することができる。例えば、任意のブラウザ又はデバイス特定コード文は、変更される及び／又はコード行から取り除かれ得る。このように、結果としてのテスト・スクリプトは、何らかのブラウザ及び／又はデバイスの依存性なしで（例えば、クッキー、キャッシング、フォーム及びハイパーリンク等なしで）実行することができ、これは、ブラウザが負荷テスト中に起動される必要がないことを意味する。
【００３３】
依存性分析および除去分析を通じて、コード行の無関係な部分が除去されることができ、それにより動的データ（例えば、相関データ、パラメータ・データなど）がより容易に識別可能となることを可能にすることができる。
【００３４】
ディスプレイ・エンジン１２６は、除去分析後に残るコード行のサブセットの表示をもたらすことができる。コード行のサブセットは、動的データを含むことができる。幾つかの具現化形態において、コード行のサブセットは、最終テスト・スクリプトを生成するためにパラメータ化され得る。例えば、ユーザ入力されたパラメータは、当該パラメータが所定の値リストと置き換えられるようにパラメータ化され得る。場合によっては、辞書が構築されることができ、この場合、辞書はパラメータ及び対応する様々な値を含むことができる。辞書は、パラメータに関して所定の値リストを検索するために後でアクセスされ得る。図８〜図９に示された例を用いて、「getUIValue('usernameField')」のようなユーザ入力されたパラメータが、ユーザ名に対して様々な値を含む所定の値リストと置き換えられ得る。
【００３５】
コード行のサブセットにおいて係るユーザ入力されたパラメータを識別することに役立つために、ディスプレイ・エンジン１２６は、ユーザ入力されたパラメータ（例えば、「getUIValue('usernameField')」及び／又はユーザ入力されたパラメータを含むコード行）がコード行のサブセットの残りの部分と視覚的に異なって表示されるように、コード行のサブセットを提示することができる。例えば、ユーザ入力されたパラメータ・データは、強調表示され、異なる色で示され、異なるフォントで示され、及び／又は別な方法でより容易に識別可能にされ得る。
【００３６】
それらの個々の機能を実施する際、エンジン１２１〜１２６はデータ記憶装置１２９及び／又は他の適切なデータベース（単数または複数）にアクセスすることができる。データ記憶装置１２９は、データを格納および検索するために使用され得る負荷テスト・システム１１０にアクセス可能な任意のメモリを意味することができる。データ記憶装置１２９及び／又は他のデータベースは、ランダム・アクセス・メモリ（ＲＡＭ）、読み出し専用メモリ（ＲＯＭ）、電気的消去可能ＲＯＭ（ＥＥＰＲＯＭ）、キャッシュメモリ、フロッピー（登録商標）ディスク、ハードディスク、光ディスク、テープ、半導体ドライブ、フラッシュドライブ、携帯型コンパクトディスク、及び／又はコンピュータ実行可能命令および／またはデータを格納するための他の記憶媒体を含むことができる。負荷テスト・システム１１０は、局所的に、或いはネットワーク５０又は他のネットワークを介して遠隔的にデータ記憶装置１２９にアクセスすることができる。
【００３７】
データ記憶装置１２９は、データを編成および格納するためのデータベースを含むことができる。データベース１２９は、例えばOracle Corporationにより市販されているOracle（登録商標）リレーショナル・データベースとすることができる、当該Oracle（登録商標）リレーショナル・データベースを含むことができる、又は当該Oracle（登録商標）リレーショナル・データベースに接続して機能することができる。また、Informix（登録商標）、ＤＢ２（Database２）、或いはファイルベース（例えば、コンマ又はタブ分離されたファイル）又はクエリのフォーマット、プラットフォーム、又はＯＬＡＰ（On Line Analytical processing）、ＳＱＬ（Structured Query Language）、ＳＡＮ（storage area network）、Microsoft Access（登録商標）、MySQL、PostgreSQL、HSpace、Apache Cassandra、MongoDB、Apache CouchDB（登録商標）、又はその他を含む他のデータ記憶装置のような、他のデータベースも使用され得る、組み込まれ得る、又はアクセスされ得る。データベースは、単一の又は複数の物理的デバイス（単数または複数）に、及び単一の又は複数の物理的記憶位置（単数または複数）に存在することができる。データベースは、複数のタイプのデータ及び／又はファイル及び関連するデータ又はファイル記述、管理情報、又は任意の他のデータを格納することができる。
【００３８】
図２は、例示的な負荷テスト・システム２１０を示すブロック図である。負荷テスト・システム２１０は、コード取得エンジン２２１、依存性分析エンジン２２２、除去分析エンジン２２３、ディスプレイ・エンジン２２４、及び／又は他のエンジンを含むことができる。エンジン２２１〜２２４はそれぞれ、エンジン１２１、１２３、１２４、及び１２６を意味する。
【００３９】
図３は、負荷テスト用のプロセッサにより実行可能な命令を含む例示的な機械可読記憶媒体３１０を示すブロック図である。
【００４０】
上記の説明において、エンジン１２１〜１２６は、ハードウェア及びプログラミングの組み合わせとして説明された。エンジン１２１〜１２６は、多数の様式で実現され得る。図３を参照すると、プログラミングは、機械可読記憶媒体３１０に格納されたプロセッサ実行可能命令３２１〜３２６とすることができ、ハードウェアは、これらの命令を実行するためのプロセッサ３１１を含むことができる。かくして、機械可読記憶媒体３１０は、プロセッサ３１１により実行された際に図１の負荷テスト・システム１１０を実現するプログラム命令またはコードを格納すると考えられ得る。
【００４１】
図３において、機械可読記憶媒体３１０の実行可能プログラム命令は、コード取得命令３２１、制御フロー取得命令３２２、依存性分析実施命令３２３、除去分析実施命令３２４、デバイス特定コード変更命令３２５、及びディスプレイ命令３２６として示される。命令３２１〜３２６は、実行された際に、プロセッサ３１１にエンジン１２１〜１２６をそれぞれ実現させるプログラム命令を意味する。
【００４２】
図４は、負荷テスト用のプロセッサにより実行可能な命令を含む例示的な機械可読記憶媒体４１０を示すブロック図である。
【００４３】
上記の説明において、エンジン１２１〜１２６は、ハードウェア及びプログラミングの組み合わせとして説明された。エンジン１２１〜１２６は、多数の様式で実現され得る。図４を参照すると、プログラミングは、機械可読記憶媒体４１０に格納されたプロセッサ実行可能命令４２１〜４２４とすることができ、ハードウェアは、これらの命令を実行するためのプロセッサ４１１を含むことができる。かくして、機械可読記憶媒体４１０は、プロセッサ４１１により実行された際に図１の負荷テスト・システム１１０を実現するプログラム命令またはコードを格納すると考えられ得る。
【００４４】
図４において、機械可読記憶媒体４１０の実行可能プログラム命令は、コード取得命令４２１、制御フロー取得命令４２２、依存性分析実施命令４２３、及び除去分析実施命令４２４として示される。命令４２１〜４２４は、実行された際に、プロセッサ４１１にエンジン１２１〜１２４をそれぞれ実現させるプログラム命令を意味する。
【００４５】
機械可読記憶媒体３１０（又は機械可読記憶媒体４１０）は、実行可能命令を含む又は格納する任意の電子、磁気、光学、又は他の物理的記憶デバイスとすることができる。幾つかの具現化形態において、機械可読記憶媒体３１０（又は機械可読記憶媒体４１０）は、持続性記憶媒体とすることができ、この場合、用語「持続性」は、一時的に伝搬する信号を含まない。機械可読記憶媒体３１０（又は機械可読記憶媒体４１０）は、単一のデバイスで実現され得るか、又はデバイスにわたって分散され得る。同様に、プロセッサ３１１（又はプロセッサ４１１）は、機械可読記憶媒体３１０（又は機械可読記憶媒体４１０）により格納された命令を実行することができる任意の数のプロセッサを意味することができる。プロセッサ３１１（又はプロセッサ４１１）は、単一のデバイスに集積化され得るか、又はデバイスにわたって分散され得る。更に、機械可読記憶媒体３１０（又は機械可読記憶媒体４１０）は、プロセッサ３１１（又はプロセッサ４１１）と同じデバイスに完全に又は部分的に集積化され得るか、又は別個であるがそのデバイス及びプロセッサ３１１（又はプロセッサ４１１）にアクセス可能であるものとすることができる。
【００４６】
一例において、プログラム命令は、インストールされる際に負荷テスト・システム１１０を実現するためにプロセッサ３１１（又はプロセッサ４１１）により実行され得るインストール・パッケージの一部とすることができる。この場合、機械可読記憶媒体３１０（又は機械可読記憶媒体４１０）は、フロッピー（登録商標）ディスク、ＣＤ、ＤＶＤ、又はフラッシュドライブのような携帯型媒体、或いはインストール・パッケージがダウンロードされてインストールされ得るサーバにより維持されているメモリとすることができる。別の例において、プログラム命令は、既にインストールされているアプリケーション（単数または複数）の一部とすることができる。ここで、機械可読記憶媒体３１０（又は機械可読記憶媒体４１０）は、ハードディスク、光ディスク、テープ、半導体ドライブ、ＲＡＭ、ＲＯＭ、又はＥＥＰＲＯＭなどを含むことができる。
【００４７】
プロセッサ３１１は、機械可読記憶媒体３１０に格納された命令の検索および実行に適した、少なくとも１つの中央処理装置（ＣＰＵ）、マイクロプロセッサ、及び／又は他のハードウェア・デバイスとすることができる。プロセッサ３１１は、プログラム命令３２１〜３２６及び／又は他の命令をフェッチする、復号する、及び実行することができる。代案として、又は命令を検索および実行することに加えて、プロセッサ３１１は、命令３２１〜３２６及び／又は他の命令の少なくとも１つの機能を実施するための多数の電子構成要素を含む少なくとも１つの電子回路を含むことができる。
【００４８】
プロセッサ４１１は、機械可読記憶媒体４１０に格納された命令の検索および実行に適した、少なくとも１つの中央処理装置（ＣＰＵ）、マイクロプロセッサ、及び／又は他のハードウェア・デバイスとすることができる。プロセッサ４１１は、プログラム命令４２１〜４２４及び／又は他の命令をフェッチする、復号する、及び実行することができる。代案として、又は命令を検索および実行することに加えて、プロセッサ４１１は、命令４２１〜４２４及び／又は他の命令の少なくとも１つの機能を実施するための多数の電子構成要素を含む少なくとも１つの電子回路を含むことができる。
【００４９】
図５は、負荷テスト用の例示的な方法５００を示す流れ図である。図５（及び図６のような他の図面）に示された様々な処理ブロック及び／又はデータの流れ（フロー）は、ここで詳しく説明される。説明される処理ブロックは、上記で詳細に説明されたシステムの構成要素の一部または全てを用いて達成されることができ、幾つかの具現化形態において、様々な処理ブロックは異なる順序で実行されることができ、且つ様々な処理ブロックは省略され得る。追加の処理ブロックが、図示の流れ図に示された処理ブロックの一部または全てと共に実行され得る。幾つかの処理ブロックは同時に実行され得る。従って、図示された（及び詳しく後述される）方法５００は、一例であることが意図されており、そういうものだから、制限するとみなされるべきではない。方法５００は、記憶媒体３１０のような機械可読記憶媒体に格納された実行可能命令の形態で、及び／又は電子回路の形態で実現され得る。
【００５０】
方法５００は、ブロック５２１で開始することができ、この場合、方法５００は、アプリケーションがクライアント・コンピューティング・デバイス（例えば、クライアント・コンピューティング・デバイス１４０）で実行される際に記録されるコード行を取得することができる。方法５００は、アプリケーションの実行インスタンスと関連したトラフィックを監視および／または記録することができる。例えば、コード行は、ウェブ・アプリケーション（例えば、サーバ・コンピューティング・デバイス１３０に常駐）がクライアント・コンピューティング・デバイス１４０のウェブ・ブラウザで実行される際に記録され得る。ユーザがウェブ・ブラウザを介してウェブ・アプリケーションと相互作用する際、ユーザのアクション（例えば、グラフィカル・ユーザー・インターフェース（ＧＵＩ）要素のクリック、フォームに記入など）及び／又は係るユーザのアクションに応じてなされる任意の関数呼び出しが記録され得る。コード行は、実行の時間順に記録され得る。記録されたコード行は、異なる順序で配列され得るか、又はそうでなければ変更され得る。
【００５１】
ブロック５２２において、方法５００は、少なくとも１つの変数への依存性がコード行の個々の行に存在するか否かを判断することができる。例えば、方法５００は、実行の時間順を上る方向に移行することにより依存性分析を実施し、依存性分析の結果に基づいてコード行の個々の行を除去するか否かを判断することができる。依存性が存在するという判断に応じて、方法５００は、ブロック５２３において、データ記憶装置（例えば、図１のデータ記憶装置１２９）に依存性を格納することができる。図８に示された例は、「sendUser」と名付けられた関数を示す。方法５００は、少なくとも１つの変数への依存性が存在するか否かを、個々の行に関して判断するために、実行可能ブロック８１０の一番上の行から実行可能ブロック８１０の最も下の行まで移行することができる。この例において、方法５００は、最初の３つの行、即ち「user={name:'Joe'}」、「a=5」、及び「b=getUIValue('usesrnameField')」に依存性がないことを判断することができる。例えば、これら行は、変数「user」が'Joe'の「name」値を有し、変数「a」が５の値を有し、且つ変数「b」が'usesrnameField'と呼ばれるUIフィールドからの値を有することを単に表している。方法５００は、次の行へ移行する及び／又は変数「user2」が変数「user」に依存することを判断することができる。依存性が存在するという判断に応じて、方法５００は、データ記憶装置に依存性（例えば、変数「user2」が変数「user」に依存すること）を格納することができる。同様に、方法５００は、次の行へ移行する及び／又は変数「user」の名前が変数「b」に依存することを判断することができる。この依存性は、データ記憶装置に格納され得る。同様に、方法５００は、次の行へ移行する及び／又は変数「user3」が変数「user2」に依存することを判断することができ、それはデータ記憶装置に格納され得る。
【００５２】
ブロック５２４において、方法５００は、呼び出される変数を呼び出すネットワーク呼び出し文を含むコード行を、コード行から識別することができる。幾つかの具現化形態において、ネットワーク呼び出し文は、ブロック５２２の依存性分析が実施されている間に識別され得る。図８に示された例を用いて、ネットワーク呼び出し文は、「sendToServer(user2)」を含む行に見出され得る。方法５００は、識別されたネットワーク呼び出し文を分析および／または変数「user2」がネットワーク呼び出し文により呼び出されていることを判断することができる。ネットワーク呼び出し文が識別される場合、方法５００は、ブロック５２５に進むことができる。
【００５３】
ブロック５２５において、方法５００は、呼び出される変数およびデータ記憶装置に格納された依存性に基づいてコード行の第１のサブセットを除去することができる。例えば、方法５００は、ネットワーク呼び出し文を含むコード行から実行の時間順を下りる方向に移行することにより除去分析を実施して、依存性分析の結果（例えば、データ記憶装置１２９に格納された依存性）に基づいてコード行の個々の行を除去するか否かを判断することができる。図９に示された例を用いて、除去分析は、「sendToServer(user2)」を有するコード行から実行の時間順を下りる方向に移行することにより実施され得る。そのように行う際、方法５００は、データ記憶装置１２９に格納された依存性に基づいて、呼び出される変数「user2」がコード行の各行において少なくとも１つの変数に依存するか否かを判断することができる。
【００５４】
依存性分析および除去分析を通じて、コード行の無関係な部分が除去されることができ、それにより動的データ（例えば、相関データ、パラメータ・データなど）がより容易に識別可能となることを可能にする。除去後に残るコード行の第２のサブセットは、ユーザ入力されたパラメータ・データを含むことができる。幾つかの具現化形態において、コード行の第２のサブセットは、最終テスト・スクリプトを生成するためにパラメータ化され得る。例えば、ユーザ入力されたパラメータは、当該パラメータが所定の値リストと置き換えられるようにパラメータ化され得る。場合によっては、辞書が構築されることができ、この場合、辞書はパラメータ及び対応する様々な値を含むことができる。辞書は、パラメータに関して所定の値リストを検索するために後でアクセスされ得る。図８〜図９に示された例を用いて、「getUIValue('usernameField')」のようなユーザ入力されたパラメータが、ユーザ名に対して様々な値を含む所定の値リストと置き換えられ得る。
【００５５】
図１に戻って参照すると、コード取得エンジン１２１は、ブロック５２１を実現する役割を果たすことができる。依存性分析エンジン１２３は、ブロック５２２〜５２４を実現する役割を果たすことができる。除去分析エンジン１２４は、ブロック５２５を実現する役割を果たすことができる。
【００５６】
図６は、負荷テスト用の例示的な方法６００を示す流れ図である。図示された（及び詳しく後述される）方法６００は、一例であることが意図されており、そういうものだから、制限するとみなされるべきではない。方法６００は、記憶媒体２１０のような機械可読記憶媒体に格納された実行可能命令の形態で、及び／又は電子回路の形態で実現され得る。
【００５７】
方法６００は、ブロック６２１で開始することができ、この場合、方法６００は、アプリケーションがクライアント・コンピューティング・デバイス（例えば、クライアント・コンピューティング・デバイス１４０）で実行される際に記録されるコード行を取得することができる。方法６００は、アプリケーションの実行インスタンスと関連したトラフィックを監視および／または記録することができる。例えば、コード行は、ウェブ・アプリケーション（例えば、サーバ・コンピューティング・デバイス１３０に常駐）がクライアント・コンピューティング・デバイス１４０のウェブ・ブラウザで実行される際に記録され得る。ユーザがウェブ・ブラウザを介してウェブ・アプリケーションと相互作用する際、ユーザのアクション（例えば、グラフィカル・ユーザー・インターフェース（ＧＵＩ）要素のクリック、フォームに記入など）及び／又は係るユーザのアクションに応じてなされる任意の関数呼び出しが記録され得る。コード行は、実行の時間順に記録され得る。記録されたコード行は、異なる順序で配列され得るか、又はそうでなければ変更され得る。
【００５８】
ブロック６２２において、方法６００は、コード行の制御フローグラフ（ＣＦＧ）を取得することができる（例えば、ブロック６２１で取得される）。ＣＦＧは、実行可能なコード・ブロック及び／又は実行可能なコード・ブロック間の関係を定義することができる。図７に示された例示的なＣＦＧにおいて、ブロック７２１〜７２５は、個々の実行可能なコード・ブロックを表すことができる一方で、記録されたコード行は図７の行１〜８を含むことができる。実行可能なコード・ブロック７２１〜７２５間の関係は、図７に示された方向付けられた端部（例えば、実行可能なブロックを接続する矢印線）により表され得る。
【００５９】
幾つかの具現化形態において、ＣＦＧは、ユーザのアプリケーションとの相互作用の履歴に基づいて変更され得る。例えば、ユーザ（又はユーザのグループ）が、ウェブ・ブラウザを介してウェブ・アプリケーションと相互作用しながら、特定のＧＵＩ要素をクリックしない又は頻繁に（例えば、所定の頻度値の閾値未満）クリックしない場合、対応するコード行、実行可能なコード・ブロック、及び／又は方向付けられた端部は、ＣＦＧから取り除かれ得る。図７に示された例を用いて、実行可能なブロック７２３が、行５のコードを実行するために特定のＧＵＩボタンのユーザのクリックを必要とする「ＩＦ」文を表すと仮定する。そのユーザのアプリケーションとの相互作用（及び／又は複数のユーザのアプリケーションとの相互作用）の（例えば、特定の時間期間の）履歴は、ＧＵＩボタンがクリックされなかった（又は制御フロー・エンジン１２２により設定された所定の状況に応じて頻繁にクリックされなかった）ことを示すことができる。この例において、ＣＦＧは、実行可能ブロック７２１、７２２、７２４及び７２５、並びにこれら残りのブロックを接続する対応する方向付けられた端部を残して、ＣＦＧから実行可能ブロック７２３（及び実行可能ブロック７２３に接続された方向付けられた端部）を取り除くことにより、変更され得る。
【００６０】
ブロック６２３において、方法６００は、少なくとも１つの変数への依存性がコード行の個々の行に存在するか否かを判断するために、ＣＦＧ（又は変更されたＣＦＧ）の第１の方向に移行することにより依存性分析を実施することができる。第１の方向は、実行の時間順を上る方向を表すことができる。図８は、単一の実行可能ブロック（例えば、ブロック８１０）が存在する第１のＣＦＧに基づいて実施された例示的な依存性分析を示す。図８において、方法６００は、少なくとも１つの変数への依存性が存在するか否かを、個々の行に関して判断するために、実行可能ブロック８１０の一番上の行から実行可能ブロック８１０の最も下の行まで移行することができる。図９は、異なる（又は第２の）ＣＦＧに基づいて実施された例示的な依存性分析を示し、この場合if-else文を含む３つの実行可能ブロック（例えば、ブロック９１０〜９１２）が存在する。幾つかの具現化形態において、依存性分析は、ブロック９１０のコード行の第１のセットからブロック９１１のコード行の第２のセットまで、及び／又はブロック９１０のコード行の第１のセットからブロック９１２のコード行の第３のセットまで移行することにより実施され得る。
【００６１】
ブロック６２４において、方法６００は、呼び出される変数を呼び出すネットワーク呼び出し文を含むコード行を、コード行から識別することができる。幾つかの具現化形態において、ネットワーク呼び出し文は、依存性分析がＣＦＧ（又は変更されたＣＦＧ）の第１の方向に移行することにより実施されている間に識別され得る。図８に示された例を用いて、ネットワーク呼び出し文は、「sendToServer(user2)」を含む行に見出され得る。方法６００は、識別されたネットワーク呼び出し文を分析および／または変数「user2」がネットワーク呼び出し文により呼び出されていることを判断することができる。ネットワーク呼び出し文が識別される場合、方法６００は、ＣＦＧ（又は変更されたＣＦＧ）の反対方向（例えば、第２の方向）に、識別されたネットワーク呼び出し文を含むコード行から移行し始めて、除去分析を実施することができる。第２の方向は、実行の時間順を下りる方向を意味することができる。
【００６２】
ブロック６２５において、方法６００は、ネットワーク呼び出し文を含むコード行からＣＦＧ（又は変更されたＣＦＧ）の第２の方向に移行することにより除去分析を実施して、依存性分析の結果（例えば、データ記憶装置１２９に格納された依存性）に基づいてコード行の各行を除去するか否かを判断することができる。図９に示された例を用いて、除去分析は、ブロック９２２のコード行の第３のセットからブロック９２０のコード行の第１のセットまで、及び／又はブロック９２１のコード行の第２のセットからブロック９２０のコード行の第１のセットまで移行することにより実施され得る。この例において、除去分析は、「sendToServer(user2)」を有するコード行から第２の方向に移行することにより実施され得る。そのように行う際、方法６００は、データ記憶装置１２９に格納された依存性に基づいて、呼び出される変数「user2」がコード行の各行において少なくとも１つの変数に依存するか否かを判断することができる。
【００６３】
ブロック６２６において、方法６００は、除去後に残るコード行のサブセットを取得することができる。依存性分析および除去分析を通じて、コード行の無関係な部分が除去されることができ、それにより動的データ（例えば、相関データ、パラメータ・データなど）がより容易に識別可能となることを可能にする。
【００６４】
ブロック６２７において、方法６００は、クライアント・コンピューティング・デバイス１４０及び／又はクライアント・コンピューティング・デバイス１４０のブラウザに特有であるコード文を含むコード行を変更することができる。例えば、任意のブラウザ又はデバイス特定コード文は、変更される及び／又はコード行から取り除かれ得る。このように、結果としてのテスト・スクリプトは、何らかのブラウザ及び／又はデバイスの依存性なしで（例えば、クッキー、キャッシング、フォーム及びハイパーリンク等なしで）実行することができ、これは、ブラウザが負荷テスト中に起動される必要がないことを意味する。
【００６５】
コード行のサブセットは、動的データを含むことができる。幾つかの具現化形態において、コード行のサブセットは、最終テスト・スクリプトを生成するためにパラメータ化され得る。例えば、ユーザ入力されたパラメータは、当該パラメータが所定の値リストと置き換えられるようにパラメータ化され得る。場合によっては、辞書が構築されることができ、この場合、辞書はパラメータ及び対応する様々な値を含むことができる。辞書は、パラメータに関して所定の値リストを検索するために後でアクセスされ得る。図８〜図９に示された例を用いて、「getUIValue('usernameField')」のようなユーザ入力されたパラメータが、ユーザ名に対して様々な値を含む所定の値リストと置き換えられ得る。
【００６６】
コード行のサブセットにおいて係るユーザ入力されたパラメータを識別することに役立つために、方法６００は、除去後に残るコード行のサブセットにおけるユーザ入力されたパラメータ・データを検出することができ（ブロック６２８）、ユーザ入力されたパラメータ（例えば、「getUIValue('usernameField')」及び／又はユーザ入力されたパラメータを含むコード行）がコード行のサブセットの残りの部分と視覚的に異なって表示されるように、コード行のサブセットを提示することができる（ブロック６２９）。例えば、ユーザ入力されたパラメータ・データは、強調表示され、異なる色で示され、異なるフォントで示され、及び／又は別な方法でより容易に識別可能にされ得る。
【００６７】
図１に戻って参照すると、コード取得エンジン１２１は、ブロック６２１を実現する役割を果たすことができる。制御フロー・エンジン１２２は、ブロック６２２を実現する役割を果たすことができる。依存性分析エンジン１２３は、ブロック６２３〜６２４を実現する役割を果たすことができる。除去分析エンジン１２４は、ブロック６２５〜６２６を実現する役割を果たすことができる。デバイス特定コード変更エンジン１２５は、ブロック６２７を実現する役割を果たすことができる。ディスプレイ・エンジン１２６は、ブロック６２８〜６２９を実現する役割を果たすことができる。
【００６８】
図７〜図９は、図１〜図６に関連して本明細書で説明される。
【００６９】
上記の開示は、負荷テストに関する多数の例示的な具現化形態を説明する。開示された例は、システム、デバイス、コンピュータ可読記憶媒体、及び負荷テストの方法を含むことができる。説明のために、特定の例が、図１〜図４に示された構成要素に関連して説明された。しかしながら、例示された構成要素の機能は、一部重複してもよく、より少ない数の又はより多い数の要素および構成要素でもたらされてもよい。
【００７０】
更に、例示された要素の機能の全て又は一部は、共存することができるか、又は幾つかの地理的に離散した場所の間に分散され得る。更に、開示された例は、様々な環境で実現されることができ、例示された例に限定されない。更に、図５〜図６に関連して説明された動作の順序は、例であり、制限することが意図されていない。追加の又はより少ない動作、或いは動作の組み合わせが、開示された例の範囲から逸脱せずに使用され得る又は変更され得る。更に、開示された例と一致する具現化形態は、任意の特定の順序で動作のシーケンスを実行する必要はない。かくして、本開示は、具現化形態の考えられる例を単に説明しており、多くの変形および変更が説明された例になされ得る。係る変更および変形は、本開示の範囲内に含まれることが意図されており、以下の特許請求の範囲により保護される。
【図１】
2018502390.tif 000003
【図２】
2018502390.tif 000004
【図３】
2018502390.tif 000005
【図４】
2018502390.tif 000006
【図５】
2018502390.tif 000007
【図６】
2018502390.tif 000008
【図７】
2018502390.tif 000009
【図８】
2018502390.tif 000010
【図９】
2018502390.tif 000011
【国際調査報告】
2018502390.tif 000012
2018502390.tif 000013