如何:创建记录器插件
通过 WebTestRecorderPlugin,可以修改记录的 Web 性能测试。 修改发生,在选择 Web 的 停止 性能测试记录器工具栏之后,但在 Web 保存和现有测试之前性能测试编辑器。
记录器插件有助于解决的主要问题是对动态参数执行自定义关联。 通过内置的关联功能,Web 性能测试会在测试完成时或在您使用 Web 性能测试编辑器工具栏上的**“将动态参数提升为 Web 测试参数”**时,在 Web 记录中检测动态参数。 有关更多信息,请参见如何:解决由动态参数导致的 Web 性能测试播放问题。 但是,内置的检测功能并不是总能找到所有动态参数。 例如,该功能找不到通常会在 5 到 30 分钟之间更改其值的会话 ID。 因此,必须手动执行关联过程。 有关更多信息,请参见如何:将动态参数提升为 Web 性能测试参数。
通过 WebTestRecorderPlugin,您可以为自己的自定义插件编写代码。 在 Web 性能测试编辑器中保存和显示 Web 性能测试之前,此插件可以多种方式执行关联或修改该 Web 性能测试。 因此,如果您确定必须为许多记录关联特定动态变量,则可自动执行此过程。
可以使用记录器插件的某些其他方法可用于在 Web 性能测试中添加提取和验证规则、添加上下文参数或将注释转换为事务。
下面的过程介绍如何为记录器插件创建基本代码、部署插件和执行插件。 这些过程之后的示例代码演示如何使用 Visual C# 创建自定义动态参数关联记录器插件。
要求
- Visual Studio 旗舰版
创建记录器插件
创建记录器插件
打开包含 Web 性能,负载测试与 Web 的项目的解决方案的性能要为其创建记录器插件。
在解决方案资源管理器中,右击解决方案,选择" 添加,然后选择 新建项目。
随即出现**“添加新项目”**对话框。
在**“已安装的模板”下,选择“Visual C#”**。
在模板列表中,选择**“类库”**。
在**“名称”**文本框中,键入记录器插件的名称。
类库将添加到解决方案资源管理器中,并且将在代码编辑器中打开新类。
在解决方案资源管理器的新类库项目文件夹中,右击**“引用”文件夹,然后选择“添加引用”**。
提示
新类库项目文件夹的一个示例“RecorderPlugins”。
将显示**“添加引用”**对话框。
选择**“.NET”**选项卡。
向下滚动并选择的 Microsoft.VisualStudio.QualityTools.WebTestFramework 然后选择 确定。
**“Microsoft.VisualStudio.QualityTools.WebTestFramework”将添加到解决方案资源管理器的“引用”**文件夹中。
为记录器插件编写代码。 首先,创建一个从 WebTestRecorderPlugin 派生的新公共类。
重写 PostWebTestRecording 方法。
public class Class1 : WebTestRecorderPlugin { public override void PostWebTestRecording(object sender, PostWebTestRecordingEventArgs e) { base.PostWebTestRecording(sender, e); } }
事件参数将为您提供两个要使用的对象:记录的结果和记录的 Web 性能测试。 这样您就可以循环访问结果以查找特定值,然后跳转到 Web 性能测试中的同一请求以进行修改。 当您要添加上下文参数或参数化 URL 的某些部分时,还可以修改 Web 性能测试。
备注
如果确实要修改 Web 性能测试,则还需要将 RecordedWebTestModified 属性设置为 true:e.RecordedWebTestModified = true;
根据您希望记录器插件在 Web 记录发生后执行的操作来添加更多代码。 例如,可以添加代码来处理自定义关联,如以下示例所示。 您还可以为将注释转换为事务或向 Web 性能测试添加验证规则等操作创建记录器插件。
在 生成 菜单上,选择生成 <class library project name>"。
接下来,必须部署记录器插件以使其向 Visual Studio 旗舰版注册。
部署记录器插件
在编译记录器插件后,需要在两个位置之一将生成的 DLL:
%ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies\WebTestPlugins
%USERPROFILE%\My Documents\Visual Studio 2012\WebTestPlugins
警告
在将记录器插件复制到以上两个位置之一后,必须重新启动 Visual Studio 旗舰版,以便注册记录器插件。
执行记录器插件
创建新的 Web 性能测试时,您会看到**“启用 WebTestRecordPlugins”**对话框。 **“启用 WebTestRecordPlugins”**对话框显示了可以执行的所有可用插件。
执行记录器插件
创建新的 Web 性能测试。 有关更多信息,请参见如何:使用 Web 性能测试记录器创建新的 Web 性能测试。
将显示**“启用 WebTestRecordPlugins”**对话框。
为记录器插件对应的复选框并选择好。
在 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}}";
}
}
}
}
}
}
}
}
}
请参见
任务
如何:使用 Web 性能测试编辑器编辑现有 Web 性能测试