如何:为 Web 性能测试结果查看器创建 Visual Studio 外接程序

本主题适用于:

Visual Studio 旗舰版

Visual Studio 高级专业版

Visual Studio 专业版 

Visual Studio 学习版

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

您可以使用以下命名空间来扩展 Web 性能测试结果查看器的 UI:

此外,您还需要添加对位于 %ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies 文件夹中的 LoadTestPackage.dll 的引用。

  • 若要扩展 Web 性能测试结果查看器的 UI,必须创建 Visual Studio 外接程序和用户控件。 下面的过程说明如何创建外接程序、用户控件以及如何实现扩展 Web 性能测试结果查看器的 UI 所需的类。

创建或打开包含 ASP.NET Web 应用程序和测试项目的解决方案

准备扩展 Web 性能测试结果查看器

  • 创建或打开一个可用来进行试验的非生产解决方案,该解决方案中应包含一个 ASP.NET Web 应用程序以及一个带有针对 ASP.NET Web 应用程序的一个或多个 Web 性能测试的测试项目。

    提示

    您可以遵循演练:创建简单的 Web 应用程序演练:记录和运行 Web 性能测试中的过程,创建 ASP.NET Web 应用程序和包含 Web 性能测试的测试项目。

创建 Visual Studio 外接程序

外接程序是在 Visual Studio 集成开发环境 (IDE) 中运行的已编译的 DLL。 编译有助于保护知识产权和提高性能。 虽然可以手动创建外接程序,但您可能会发现使用“外接程序向导”更为简便。 此向导创建一个功能全面但却很基本的外接程序,创建完该程序后可立即运行它。 “外接程序向导”生成基本程序后,可向其添加代码并对其进行自定义。

“外接程序向导”让您可以为外接程序提供显示名称和说明。 这两项内容都将出现在**“外接程序管理器”中。 还可以选择让向导生成代码,用于向“工具”菜单中添加可打开外接程序的命令。 您也可以选择为外接程序显示一个自定义“关于”**对话框。 向导完成时,将生成只有一个实现外接程序的类的新项目。 该类名为“Connect”。

您将在本主题末尾使用**“外接程序管理器”**。

有关更多信息,请参见创建外接程序和向导

使用“外接程序向导”创建外接程序

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

    将显示“新建项目”对话框。

  2. 在**“已安装的模板”下,展开“其他项目类型”并选择“扩展性”**。

  3. 在模板列表中,选择**“Visual Studio 外接程序”**。

  4. 在“名称”下,键入外接程序的名称。 例如“WebPerfTestResultsViewerAddin”。

  5. 单击**“确定”**。

    此时 Visual Studio 外接程序向导将启动。

  6. 单击**“下一步”**。

  7. 在**“选择编程语言”**页上,选择要用于编写外接程序的编程语言。

    提示

    本主题使用 Visual C# 编写代码示例。

  8. 在**“选择应用程序主机”**页上,选择“Microsoft Visual Studio 2010”并清除“Microsoft Visual Studio 2010 宏”。

  9. 单击**“下一步”**。

  10. 在**“输入名称和说明”**页中键入外接程序的名称和说明。

    创建了外接程序后,其名称和说明将显示在**“外接程序管理器”“可用外接程序”**列表中。 向外接程序的说明中添加足够的详细信息,以便用户能够了解外接程序的功能、工作方式等信息。

  11. 单击**“下一步”**。

  12. 在**“选择外接程序选项”页上,选择“我希望我的外接程序在宿主应用程序启动时加载”**。

  13. 清除其余复选框。

  14. 在**“选择‘帮助’中的‘关于’信息”页上,可指定是否将有关外接程序的信息显示在“关于”对话框中。 如果您确实希望显示此信息,则选中“是的,我希望我的外接程序提供‘关于’对话框信息”**复选框。

    可以添加到 Visual Studio 的**“关于”**对话框中的信息包括版本号、支持详细信息和授权数据等信息。

  15. 单击**“下一步”**。

  16. 所选的选项将显示在**“摘要”页上供您检查。 如果感到满意,请单击“完成”以创建外接程序。 如果要更改某些内容,请单击“上一步”**按钮。

    将创建新的解决方案和项目,并且新外接程序的 Connect.cs 文件将显示在代码编辑器中。

    在完成下面的创建将由此 WebPerfTestResultsViewerAddin 项目引用的用户控件的过程后,您将向 Connect.cs 文件添加代码。

创建了外接程序后,必须先向 Visual Studio 注册此外接程序,然后才能在**“外接程序管理器”**中激活它。 使用具有 .addin 文件扩展名的 XML 文件来执行此操作。

.addin 文件描述了 Visual Studio 在**“外接程序管理器”中显示外接程序所需的信息。 在 Visual Studio 启动时,它会查找 .addin 文件位置,获取任何可用的 .addin 文件。 如果找到相应文件,则会读取 XML 文件,并向“外接程序管理器”**提供在单击外接程序进行启动时所需的信息。

使用外接程序向导创建外接程序时,会自动创建一个 .addin 文件。

有关更多信息,请参见外接程序注册

外接程序文件位置

外接程序向导会自动创建 .addin 文件的两个副本,如下所示:

.Addin 文件位置

.Dll 文件位置

说明

根项目文件夹

\Documents\Visual Studio 2010\Projects\MyAddin1\MyAddin1\

本地路径 (MyAddin1.dll)

用于部署外接程序项目。 包含在项目中以方便编辑,并使用本地路径安装以进行 XCopy 式部署。

外接程序文件夹

\Documents\Visual Studio 2010\Addins\

- 或 -

共享文档位置\Addins\

项目调试文件夹

(例如,\ Documents\Visual Studio 2010

Projects\MyAddin1\MyAddin1\bin\)

用于在调试环境中运行外接程序。 应该始终指向当前生成配置的输出路径。

创建 Windows 窗体控件库项目

在前面过程中创建的 Visual Studio 外接程序将引用 Windows 窗体控件库项目来创建 UserControl 类的实例。

有关更多信息,请参见 Windows 窗体控件

创建要在 Web 测试结果查看器中使用的控件

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

    将显示**“新建项目”**对话框。

  2. 在**“已安装的模板”下,展开“Visual Basic”“Visual C#”,然后选择“Windows”**。

    提示

    本主题使用 Visual C# 编写代码示例。

  3. 在模板列表中,选择**“Windows 窗体控件库”**。

  4. 在**“名称”**下,键入外接程序的名称。 例如,WebPerfTestResultsViewerControl。

  5. 单击**“确定”**。

    将在“解决方案资源管理器”中添加 Windows 窗体控件库项目 WebPerfTestResultsViewerControl,并在设计模式下显示 UserControl1.cs。

  6. 从“工具箱”中将 DataGridView 拖动到 userControl1 的图面上。

  7. 单击 DataGridView 的右上角的操作标记符号 (智能标记标志符号),并按照以下步骤操作:

    1. 单击**“在父容器中停靠”**。

    2. 清除**“启用添加”“启用编辑”“启用删除”“启用列重新排序”**复选框。

    3. 单击**“添加列”**。

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

    4. 在**“类型”下拉列表中,选择“DataGridViewTextBoxColumn”**。

    5. 清除**“标题文本”**中的文本“Column1”。

    6. 单击**“添加”**。

    7. 单击**“关闭”**。

  8. 在“属性”窗口中,将 DataGridView 的**“(Name)”**属性更改为“resultControlDataGridView”。

  9. 右击设计图面并选择**“查看代码”**。

    UserControl1.cs 文件将显示在代码编辑器中。

  10. 将实例化的 UserControl 类的名称从 UserContro1 更改为 resultControl:

    namespace WebPerfTestResultsViewerControl
    {
        public partial class resultControl : UserControl
        {
            public resultControl()
            {
                InitializeComponent();
            }
    

    在下一过程中,您将向 WebPerfTestResultsViewerAddin 项目的引用 resultControl 类的 Connect.cs 文件添加代码。

    您稍后将向 Connect.cs 文件添加一些附加代码。

向 WebPerfTestResultsViewerAddin 添加代码

向 Visual Studio 外接程序添加代码来扩展 Web 测试结果查看器

  1. 在解决方案资源管理器中,右击 WebPerfTestResultsViewerAddin 项目中的**“引用”节点,然后选择“添加引用”**。

  2. 在**“添加引用”对话框中,单击“.NET”**选项卡。

  3. 向下滚动并选择**“Microsoft.VisualStudio.QualityTools.WebTestFramework”“System.Windows.Forms”**。

  4. 单击**“确定”**。

  5. 再次右击**“引用”节点,然后选择“添加引用”**。

  6. 在**“添加引用”对话框中单击“浏览”**选项卡。

  7. 单击**“查找范围”**下拉列表,并导航到 %ProgramFiles%\Microsoft Visual Studio 10.0\Common7\IDE\PrivateAssemblies,然后选择 Microsoft.VisualStudio.QualityTools.LoadTestPackage.dll 文件。

  8. 单击**“确定”**。

  9. 右击“WebPerfTestResultsViewerAddin”项目节点,然后选择**“添加引用”**。

  10. 在**“添加引用”对话框中单击“项目”**选项卡。

  11. 在**“项目名称”下选择“WebPerfTestResultsViewerControl”项目,然后单击“确定”**。

  12. 如果 Connect.cs 文件仍未打开,请在解决方案资源管理器中,右击“WebPerfTestResultsViewerAddin”项目中的**“Connect.cs”文件,然后选择“查看代码”**。

  13. 在 Connect.cs 文件中,添加以下 Using 语句:

    using System.IO;
    using System.Windows.Forms;
    using System.Collections.Generic;
    using Microsoft.VisualStudio.TestTools.LoadTesting;
    using Microsoft.VisualStudio.TestTools.WebTesting;
    using WebPerfTestResultsViewerControl;
    
  14. 向下滚动到 Connect.cs 文件的底端。 如果打开 Web 性能测试结果查看器的多个实例,则需要为 UserControl 添加 GUID 列表。 稍后您将添加使用此列表的代码。

    您稍后将编码的 OnDiscconection 方法中使用另一个字符串列表。

            private DTE2 _applicationObject;
            private AddIn _addInInstance;
    
            private Dictionary<Guid, List<UserControl>> m_controls = new Dictionary<Guid, List<UserControl>>();
            private List<string> temporaryFilePaths = new List<string>();
    
  15. Connect.cs 文件从 IDTExtensibility2 类对名为 Connect 的类进行实例化,还包括一些用于实现 Visual Studio 外接程序的方法。 其中一种方法为 OnConnection 方法,用于接收有关外接程序正在加载的通知。 在 OnConnection 方法中,您将使用 LoadTestPackageExt 类为 Web 性能测试结果查看器创建扩展性包。 将下面的代码添加到 OnConnection 方法:

    public void OnConnection(object application, ext_ConnectMode connectMode, object addInInst, ref Array custom)
                {
                _applicationObject = (DTE2)application;
                _addInInstance = (AddIn)addInInst;
    
                // Create a load test packge extensibility class.
                LoadTestPackageExt loadTestPackageExt = _applicationObject.GetObject("Microsoft.VisualStudio.TestTools.LoadTesting.LoadTestPackageExt") as LoadTestPackageExt;
    
                // Process open windows.
                foreach (WebTestResultViewer webTestResultViewer in loadTestPackageExt.WebTestResultViewerExt.ResultWindows)
                {
                    WindowCreated(webTestResultViewer);
                }
    
                // Create event handlers.
                loadTestPackageExt.WebTestResultViewerExt.WindowCreated += new EventHandler<WebTestResultViewerExt.WindowCreatedEventArgs>(WebTestResultViewerExt_WindowCreated);
                loadTestPackageExt.WebTestResultViewerExt.WindowClosed += new EventHandler<WebTestResultViewerExt.WindowClosedEventArgs>(WebTesResultViewer_WindowClosed);
                loadTestPackageExt.WebTestResultViewerExt.SelectionChanged += new EventHandler<WebTestResultViewerExt.SelectionChangedEventArgs>(WebTestResultViewer_SelectedChanged);
            }
    
  16. 将下面的代码添加到 connect 类,以便为在 OnConnection 方法中添加的 loadTestPackageExt.WebTestResultViewerExt.WindowCreated 事件处理程序和 WebTestResultViewerExt_WindowCreated 方法调用的 WindowCreated 方法创建 WebTestResultViewerExt_WindowCreated 方法。

            void WebTestResultViewerExt_WindowCreated(object sender, WebTestResultViewerExt.WindowCreatedEventArgs e)
            {
                // New control added to new result viewer window.
                WindowCreated(e.WebTestResultViewer);
            }
    
    private void WindowCreated(WebTestResultViewer viewer)
            {
                // Instantiate an instance of the resultControl referenced in the WebPerfTestResultsViewerControl project.
                resultControl resultControl = new resultControl();
    
                // Add to the dictionary of open playback windows.
                System.Diagnostics.Debug.Assert(!m_controls.ContainsKey(viewer.TestResultId));
                List<UserControl> userControls = new List<UserControl>();
                userControls.Add(resultControl);
    
                // Add Guid to the m_control List to manage Result viewers and controls.
                m_controls.Add(viewer.TestResultId, userControls);
    
                // Add tabs to the playback control.
                resultControl.Dock = DockStyle.Fill;
                viewer.AddResultPage(new Guid(), "Sample", resultControl);
            }
    
  17. 将下面的代码添加到 connect 类,以便为在 OnConnection 方法中添加的 loadTestPackageExt.WebTestResultViewerExt.SelectionChanged 事件处理程序创建 WebTestResultViewer_SelectedChanged 方法:

            void WebTestResultViewer_SelectedChanged(object sender, WebTestResultViewerExt.SelectionChangedEventArgs e)
            {
                foreach (UserControl userControl in m_controls[e.TestResultId])
                {
                    // Update the userControl in each result viewer.
                    resultControl resultControl = userControl as resultControl;
                    if (resultControl != null)
                        // Call the resultControl's Update method (This will be added in the next procedure).
                        resultControl.Update(e.WebTestRequestResult);
                }
            }
    
  18. 将下面的代码添加到 connect 类,以便为在 OnConnection 方法中添加的 loadTestPackageExt.WebTestResultViewerExt.WindowClosed 事件处理程序创建 WebTesResultViewer_WindowClosed 方法:

            void WebTesResultViewer_WindowClosed(object sender, WebTestResultViewerExt.WindowClosedEventArgs e)
            {
                if (m_controls.ContainsKey(e.WebTestResultViewer.TestResultId))
                {
                    m_controls.Remove(e.WebTestResultViewer.TestResultId);
                }
            }
    

    现在 Visual Studio 外接程序的代码已完成,您需要向 WebPerfTestResultsViewerControl 项目中的 resultControl 添加 Update 方法。

向 WebPerfTestResultsViewerControl 添加代码

有关更多信息,请参见 Windows 窗体控件开发基础知识

向用户控件添加代码

  1. 在“解决方案资源管理器”中右击 WebPerfTestResultsViewerControl 项目节点,然后选择**“属性”**。

  2. 选择**“应用程序”选项卡,然后单击“目标框架”下拉列表,选择“.NET Framework 4”**并关闭“属性”。

    为支持扩展 Web 性能测试结果查看器所需的 dll 引用,此操作是必需的。

  3. 在解决方案资源管理器中,在 WebPerfTestResultsViewerControl 项目中右击**“引用”节点,然后选择“添加引用”**。

  4. 在**“添加引用”对话框中,单击“.NET”**选项卡。

  5. 向下滚动并选择**“Microsoft.VisualStudio.QualityTools.WebTestFramework”**。

  6. 单击**“确定”**。

  7. 在 UserControl1.cs 文件中,添加以下 Using 语句:

    using Microsoft.VisualStudio.TestTools.WebTesting;
    using Microsoft.VisualStudio.TestTools.WebTesting.Rules;
    
  8. 添加 Update 方法,然后从 Connect.cs 文件中的 WebPerfTestResultsViewerAddin WebTestResultViewer_SelectedChanged 方法调用该方法并传递 WebTestRequestResult。 Update 方法使用在 WebTestRequestResult 中传递给它的各种属性填充 DataGridView。

    public void Update(WebTestRequestResult WebTestResults)
            {
                // Clear the DataGridView when a request is selected.
                resultControlDataGridView.Rows.Clear();
                // Populate the DataGridControl with properties from the WebTestResults.
                this.resultControlDataGridView.Rows.Add("Request: " + WebTestResults.Request.Url.ToString());
                this.resultControlDataGridView.Rows.Add("Response: " + WebTestResults.Response.ResponseUri.ToString());
                foreach (RuleResult ruleResult in WebTestResults.ExtractionRuleResults)
                {
                    this.resultControlDataGridView.Rows.Add("Extraction rule results: " + ruleResult.Message.ToString());
                }
                foreach (RuleResult ruleResult in WebTestResults.ValidationRuleResults)
                {
                    this.resultControlDataGridView.Rows.Add("Validation rule results: " + ruleResult.Message.ToString());
                }
                foreach (WebTestError webTestError in WebTestResults.Errors)
                {
                    this.resultControlDataGridView.Rows.Add("Error: " + webTestError.ErrorType.ToString() + " " + webTestError.ErrorSubtype.ToString() + " " + webTestError.ExceptionText.ToString());
                }
            }
    

生成 WebPerfTestResultsViewerAddin 解决方案

生成解决方案

  • 在**“生成”菜单上,选择“生成解决方案”**。

注册 WebPerfTestResultsViewerAddin 外接程序

使用外接程序管理器注册外接程序

  1. 在**“工具”菜单上选择“外接程序管理器”**。

  2. 将显示**“外接程序管理器”**对话框。

  3. 在**“可用外接程序”列中,选中 WebPerfTestResultsViewerAddin 外接程序对应的复选框,然后清除“启动”列和“命令行”**列下方的复选框。

  4. 单击**“确定”**。

    有关更多信息,请参见如何:使用外接程序管理器控制外接程序

使用“生成 WebPerfTestResultsViewerAddin 外接程序”运行 Web 性能测试

为 Web 测试结果查看器运行新的 VS 外接程序

  1. 运行 Web 性能测试,您将会看到在 Web 性能测试结果查看器中显示的 WebPerfTestResultsViewerAddin 外接程序的标题为“Sample”的新选项卡。

  2. 单击此选项卡可查看在 DataGridView 中显示的属性。

安全性

为了防止恶意外接程序自动激活进而改进安全性,Visual Studio 在名为**“外接程序/宏的安全性”“工具选项”**页中提供了一些设置。

另外,该选项页使您可以指定供 Visual Studio 在其中搜索 .AddIn 注册文件的文件夹。 这种方式可让您对可读取 .AddIn 注册文件的位置进行限制,从而改进了安全性。 这种方式可防止无意中使用 .AddIn 恶意文件。

外接程序安全性设置

Add-in/Macros Security, Environment, Options Dialog Box中与外接程序安全性相关的设置如下所示:

  • 允许加载外接程序组件。   默认为选中。 在选中时,允许在 Visual Studio 中加载外接程序。 在未选中时,禁止在 Visual Studio 中加载外接程序。

  • 允许从 URL 加载外接程序组件。   默认为未选中。 在选中时,允许从外部网站加载外接程序。 在未选中时,禁止在 Visual Studio 中加载远程外接程序。 如果某个外接程序由于某种原因无法加载,则无法从网站加载它。 此设置只控制外接程序 DLL 的加载。 .Addin 注册文件必须始终位于本地系统上。

  • 有关更多信息,请参见外接程序安全性

请参见

任务

如何:使用外接程序管理器控制外接程序

演练:调试外接程序项目

参考

UserControl

Microsoft.VisualStudio.TestTools.LoadTesting

Microsoft.VisualStudio.TestTools.WebTesting

Microsoft.VisualStudio.TestTools.WebTesting.Rules

UserControl

DataGrid

概念

外接程序注册

自动化对象模型图表

Windows 窗体控件中的事件

其他资源

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

Windows 窗体控件中的属性

使用 .NET Framework 开发自定义 Windows 窗体控件