方法: レコーダー プラグインを作成する
発行: 2016年7月
WebTestRecorderPlugin を使用すると、記録された Web パフォーマンス テストを変更できます。 変更は、[Web パフォーマンス テスト レコーダー] ツール バーの [停止] をクリックした後、テストが保存されて Web パフォーマンス テスト エディターで表示される前に行われます。
レコーダー プラグインの主な利点は、動的パラメーターに対して独自のカスタム関連付けができるようになることです。 組み込みの関連付け機能では、Web パフォーマンス テストによる Web 記録の動的パラメーターの検出が、完了時、または Web パフォーマンス テスト エディター ツール バーの [動的パラメーターを Web テスト パラメーターに昇格] の使用時に行われます。 詳細については、「[廃版] 方法: 動的パラメーターによる Web パフォーマンス テスト再生の問題を解決する」を参照してください。 しかし、組み込みの検出機能では、常にすべての動的パラメーターが検出できるわけではありません。 たとえば、セッション ID は検出されません。通常、このパラメーターは、5 ~ 30 分の間隔で変更される値を取得しています。 そのため、関連付けの処理を手動で行う必要があります。 詳細については、「[廃版] 方法: 動的パラメーターを Web パフォーマンス テスト パラメーターに昇格する」を参照してください。
WebTestRecorderPlugin を使用すると、独自のカスタム プラグイン用のコードを記述できます。 このプラグインは、テストが保存されて Web パフォーマンス テスト エディターで表示される前に、さまざまな方法で Web パフォーマンス テストの関連付けや変更を行うことができます。 そのため、特定の動的変数を多くの記録と関連付けなければならないと判断した場合は、処理を自動化できます。
レコーダー プラグインの他の使用方法として、Web パフォーマンス テストでの抽出規則と検証規則の追加、コンテキスト パラメーターの追加、コメントからトランザクションへの変換などがあります。
次の手順では、レコーダー プラグインの基本的なコードの作成、プラグインの配置、およびプラグインの実行の方法について説明します。 手順の後のサンプル コードでは、Visual C# を使用してカスタムの動的パラメーター関連付けレコーダー プラグインを作成する方法を示します。
必要条件
- Visual Studio Enterprise
レコーダー プラグインの作成
レコーダー プラグインを作成するには
作成するレコーダー プラグインの対象となる Web パフォーマンス テストの Web パフォーマンスとロード テストのプロジェクトを含むソリューションを開きます。
ソリューション エクスプローラーで、ソリューションを右クリックし、[追加] をポイントして、[新しいプロジェクト] をクリックします。
[新しいプロジェクトの追加] ダイアログ ボックスが表示されます。
[インストールされているテンプレート] の [Visual C#] を選択します。
テンプレートの一覧で、[クラス ライブラリ] を選択します。
[名前] ボックスにレコーダー プラグインの名前を入力します。
クラス ライブラリがソリューション エクスプローラーに追加され、新しいクラスがコード エディターで開かれます。
ソリューション エクスプローラーの新しいクラス ライブラリ プロジェクト フォルダーで、[参照設定] フォルダーを右クリックし、[参照の追加] を選択します。
ヒント
新しいクラス ライブラリ プロジェクト フォルダーの例は、[RecorderPlugins] です。
[参照の追加] ダイアログ ボックスが表示されます。
[.NET] タブを選択します。
スクロール ダウンして、[Microsoft.VisualStudio.QualityTools.WebTestFramework] をクリックし、[OK] をクリックします。
[Microsoft.VisualStudio.QualityTools.WebTestFramework] がソリューション エクスプローラーの [参照設定] フォルダーに追加されます。
レコーダー プラグインのコードの記述 まず、WebTestRecorderPlugin クラスから派生する新しいパブリック クラスを作成します。
PostWebTestRecording メソッドをオーバーライドします。
public class Class1 : WebTestRecorderPlugin { public override void PostWebTestRecording(object sender, PostWebTestRecordingEventArgs e) { base.PostWebTestRecording(sender, e); } }
イベント引数によって、作業対象となる 2 つのオブジェクトが与えられます。記録された結果と、記録された Web パフォーマンス テストです。 これにより、結果を反復処理して特定の値を検索し、Web パフォーマンス テスト内の同じ要求に移動して、変更を行うことができるようになります。 コンテキスト パラメーターや、URL のパラメーター化された部分を追加する場合は、単に Web パフォーマンス テストを変更することもできます。
注意
Web パフォーマンス テストを変更する場合は、RecordedWebTestModified のように、e.RecordedWebTestModified = true; プロパティを true に設定する必要もあります。
Web 記録を行った後にレコーダー プラグインで何を実行するかに応じて、コードを追加します。 たとえば、以下のサンプルで示すように、カスタムの関連付けを処理するコードを追加できます。 コメントからトランザクションへの変換、Web パフォーマンス テストへの検証規則の追加などを行うようなレコーダー プラグインを作成することもできます。
[ビルド] メニューの [<クラス ライブラリ プロジェクト名> のビルド] をクリックします。
次に、Visual Studio に登録するためにレコーダー プラグインを配置する必要があります。
レコーダー プラグインの配置
レコーダー プラグインをコンパイルした後で、生成された DLL を次のうちいずれかの場所に配置する必要があります。
%ProgramFiles%\Microsoft Visual Studio 12.0\Common7\IDE\PrivateAssemblies\WebTestPlugins
%USERPROFILE%\My Documents\Visual Studio <version>\WebTestPlugins
注意
レコーダー プラグインを 2 つの場所の一方にコピーした後で、レコーダー プラグインを登録するために Visual Studio を再起動する必要があります。
レコーダー プラグインの実行
新しい Web パフォーマンス テストを作成するときには、[WebTestRecorderPlugins の有効化] ダイアログ ボックスが表示されます。 [WebTestRecorderPlugins の有効化] ダイアログ ボックスには、実行できる使用可能なすべてのプラグインが表示されます。
レコーダー プラグインを実行するには
新しい Web パフォーマンス テストを作成します。 詳細については、「Record and run a web performance test」を参照してください。
[WebTestRecorderPlugins の有効化] ダイアログ ボックスが表示されます。
レコーダー プラグインのチェック ボックスをオンにし、[OK] をクリックします。
Web パフォーマンス テストが記録を完了した後で、新しいレコーダー プラグインが実行されます。
警告
プラグインを使用する Web パフォーマンス テストまたはロード テストを実行すると、次のようなエラー メッセージが表示されることがあります。
Request failed: Exception in <plug-in> event: Could not load file or assembly '<"Plug-in name".dll file>, Version=<n.n.n.n>, Culture=neutral, PublicKeyToken=null' or one of its dependencies.The system cannot find the file specified.
この問題が発生するのは、いずれかのプラグインのコードを変更して、新しい DLL バージョン (Version=0.0.0.0) を作成したのに、プラグインが元のプラグイン バージョンを参照したままになっている場合です。この問題を解決するには、次の手順を実行します。
-
Web パフォーマンスとロード テストのプロジェクトで、参照に関する警告が表示されます。プラグイン DLL への参照を削除し、再度追加します。
-
プラグインをテストまたは該当する場所から削除し、その後、追加し直します。
-
使用例
このサンプルでは、カスタムの動的パラメーター関連付けを行う、カスタマイズされた Web パフォーマンス テスト レコーダー プラグインを作成する方法を示します。
注意
サンプル コードの完全な一覧は、このトピックの最後にあります。
サンプル コードの確認
ReportSession で最初のページを検索するための、結果の反復処理
コード サンプルのこの部分では、記録された各オブジェクトを反復処理して、応答本体で ReportSession を検索します。
foreach (WebTestResultUnit unit in e.RecordedWebTestResult.Children)
{
WebTestResultPage page = unit as WebTestResultPage;
if (page != null)
{
if (!foundId)
{
int indexOfReportSession = page.RequestResult.Response.BodyString.IndexOf("ReportSession");
if (indexOfReportSession > -1)
{
抽出規則の追加
応答が見つかったら、抽出規則を追加する必要があります。 コード サンプルのこの部分では、ExtractionRuleReference クラスを使用して抽出規則を作成し、抽出規則の追加先となる、Web パフォーマンス テスト内の正しい要求を検索します。 各結果オブジェクトには、DeclarativeWebTestItemId という名前の新しいプロパティが追加されており、それがコード内で Web パフォーマンス テストから正しい要求を取得するために使用されています。
ExtractionRuleReference ruleReference = new ExtractionRuleReference();
ruleReference.Type = typeof(ExtractText);
ruleReference.ContextParameterName = "SessionId";
ruleReference.Properties.Add(new PluginOrRuleProperty("EndsWith", "&ControlID="));
ruleReference.Properties.Add(new PluginOrRuleProperty("HtmlDecode", "True"));
ruleReference.Properties.Add(new PluginOrRuleProperty("IgnoreCase", "True"));
ruleReference.Properties.Add(new PluginOrRuleProperty("Index", "0"));
ruleReference.Properties.Add(new PluginOrRuleProperty("Required", "True"));
ruleReference.Properties.Add(new PluginOrRuleProperty("StartsWith", "ReportSession="));
ruleReference.Properties.Add(new PluginOrRuleProperty("UseRegularExpression", "False"));
WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
if (requestInWebTest != null)
{
requestInWebTest.ExtractionRuleReferences.Add(ruleReference);
e.RecordedWebTestModified = true;
}
クエリ文字列パラメーターの置換
ここで、コード サンプルのこの部分で示されているように、名前が ReportSession であるすべてのクエリ文字列パラメーターを見つけて、値を {{SessionId}} に変更します。
WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
if (requestInWebTest != null)
{
foreach (QueryStringParameter param in requestInWebTest.QueryStringParameters)
{
if (param.Name.Equals("ReportSession"))
{
param.Value = "{{SessionId}}";
}
}
}
using System.ComponentModel;
using Microsoft.VisualStudio.TestTools.WebTesting;
using Microsoft.VisualStudio.TestTools.WebTesting.Rules;
namespace RecorderPlugin
{
[DisplayName("Correlate ReportSession")]
[Description("Adds extraction rule for Report Session and binds this to querystring parameters that use ReportSession")]
public class CorrelateSessionId : WebTestRecorderPlugin
{
public override void PostWebTestRecording(object sender, PostWebTestRecordingEventArgs e)
{
//first find the session id
bool foundId = false;
foreach (WebTestResultUnit unit in e.RecordedWebTestResult.Children)
{
WebTestResultPage page = unit as WebTestResultPage;
if (page != null)
{
if (!foundId)
{
int indexOfReportSession = page.RequestResult.Response.BodyString.IndexOf("ReportSession");
if (indexOfReportSession > -1)
{
//add an extraction rule to this request
// Get the corresponding request in the Declarative Web performance test
ExtractionRuleReference ruleReference = new ExtractionRuleReference();
ruleReference.Type = typeof(ExtractText);
ruleReference.ContextParameterName = "SessionId";
ruleReference.Properties.Add(new PluginOrRuleProperty("EndsWith", "&ControlID="));
ruleReference.Properties.Add(new PluginOrRuleProperty("HtmlDecode", "True"));
ruleReference.Properties.Add(new PluginOrRuleProperty("IgnoreCase", "True"));
ruleReference.Properties.Add(new PluginOrRuleProperty("Index", "0"));
ruleReference.Properties.Add(new PluginOrRuleProperty("Required", "True"));
ruleReference.Properties.Add(new PluginOrRuleProperty("StartsWith", "ReportSession="));
ruleReference.Properties.Add(new PluginOrRuleProperty("UseRegularExpression", "False"));
WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
if (requestInWebTest != null)
{
requestInWebTest.ExtractionRuleReferences.Add(ruleReference);
e.RecordedWebTestModified = true;
}
foundId = true;
}
}
else
{
//now update query string parameters
WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
if (requestInWebTest != null)
{
foreach (QueryStringParameter param in requestInWebTest.QueryStringParameters)
{
if (param.Name.Equals("ReportSession"))
{
param.Value = "{{SessionId}}";
}
}
}
}
}
}
}
}
}
参照
WebTestRequestPlugin
PostWebTestRecording
ExtractionRuleReference
PostWebTestRecording
ロード テスト用のカスタム コードおよびカスタム プラグインの作成
[廃版] 方法: コード化された Web パフォーマンス テストを作成する
方法: 既存の Web パフォーマンス テストを編集する