如何:创建记录器插件

本主题适用于:

Visual Studio 旗舰版

Visual Studio 高级专业版

Visual Studio 专业版 

Visual Studio 学习版

主题适用 主题不适用 主题不适用 主题不适用

通过 WebTestRecorderPlugin,可以修改记录的 Web 性能测试。 修改发生在您在 Web 性能测试记录器工具栏中单击**“停止”**之后、在 Web 性能测试编辑器中保存和显示测试之前。

记录器插件有助于解决的主要问题是对动态参数执行自定义关联。 通过内置的关联功能,Web 性能测试会在测试完成时或在您使用 Web 性能测试编辑器工具栏上的**“将动态参数提升为 Web 测试参数”**时,在 Web 记录中检测动态参数。 有关更多信息,请参见如何:解决由动态参数导致的 Web 性能测试播放问题。 但是,内置的检测功能并不是总能找到所有动态参数。 例如,该功能找不到通常会在 5 到 30 分钟之间更改其值的会话 ID。 因此,必须手动执行关联过程。 有关更多信息,请参见如何:将动态参数提升为 Web 性能测试参数

通过 WebTestRecorderPlugin,您可以为自己的自定义插件编写代码。 在 Web 性能测试编辑器中保存和显示 Web 性能测试之前,此插件可以多种方式执行关联或修改该 Web 性能测试。 因此,如果您确定必须为许多记录关联特定动态变量,则可自动执行此过程。

可以使用记录器插件的某些其他方法可用于在 Web 性能测试中添加提取和验证规则、添加上下文参数或将注释转换为事务。

下面的过程介绍如何为记录器插件创建基本代码、部署插件和执行插件。 这些过程之后的示例代码演示如何使用 Visual C# 创建自定义动态参数关联记录器插件。

创建记录器插件

创建记录器插件

  1. 打开包含测试项目的解决方案,该测试项目具有要为其创建记录器插件的 Web 性能测试。

  2. 在解决方案资源管理器中,右击该解决方案,选择**“添加”,然后单击“新建项目”**。

    随即出现**“添加新项目”**对话框。

  3. 在**“已安装的模板”下,选择“Visual C#”**。

  4. 在模板列表中,选择**“类库”**。

  5. 在**“名称”**文本框中,键入记录器插件的名称。

    类库将添加到解决方案资源管理器中,并且将在代码编辑器中打开新类。

  6. 在解决方案资源管理器的新类库项目文件夹中,右击**“引用”文件夹,然后选择“添加引用”**。

    提示

    新类库项目文件夹的一个示例“RecorderPlugins”

    将显示**“添加引用”**对话框。

  7. 选择**“.NET”**选项卡。

  8. 向下滚动并选择**“Microsoft.VisualStudio.QualityTools.WebTestFramework”,然后单击“确定”**。

    **“Microsoft.VisualStudio.QualityTools.WebTestFramework”将添加到解决方案资源管理器的“引用”**文件夹中。

  9. 为记录器插件编写代码。 首先,创建一个从 WebTestRecorderPlugin 派生的新公共类。

  10. 重写 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;

  11. 根据您希望记录器插件在 Web 记录发生后执行的操作来添加更多代码。 例如,可以添加代码来处理自定义关联,如以下示例所示。 您还可以为将注释转换为事务或向 Web 性能测试添加验证规则等操作创建记录器插件。

  12. 在**“生成”**菜单中,单击“生成 <类库项目名称>”。

  13. 接下来,必须部署记录器插件以使其向 Visual Studio 2010 旗舰版注册。

部署记录器插件

编译记录器插件后,需要将得到的 .dll 放置在以下两个位置之一:

  • %ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies\WebTestPlugins

  • %USERPROFILE%\My Documents\Visual Studio 10\WebTestPlugins

警告

在将记录器插件复制到以上两个位置之一后,必须重新启动 Visual Studio 2010 旗舰版,以便注册记录器插件。

执行记录器插件

创建新的 Web 性能测试时,您会看到**“启用 WebTestRecordPlugins”**对话框。 **“启用 WebTestRecordPlugins”**对话框显示了可以执行的所有可用插件。

执行记录器插件

  1. 创建新的 Web 性能测试。 有关更多信息,请参见如何:使用 Web 性能测试记录器创建新的 Web 性能测试

    将显示**“启用 WebTestRecordPlugins”**对话框。

  2. 选中记录器插件对应的复选框,然后单击“确定”。

    在 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),则会引发这种情况,但插件仍会引用原来的插件版本。 若要更正此问题,请执行以下步骤:

    1. 在测试项目中,您会看到引用警告。 移除和重新添加对插件 DLL 的引用。

    2. 从测试或相应位置移除插件,然后再重新添加。

示例

此示例演示如何创建自定义的 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 性能测试编辑器编辑现有 Web 性能测试

参考

WebTestRequestPlugin

PostWebTestRecording

ExtractionRuleReference

PostWebTestRecording

其他资源

为负载和 Web 性能测试创建和使用自定义插件