如何:为 Web 性能测试结果查看器创建 Visual Studio 外接程序
您可以使用以下命名空间来扩展 Web 性能测试结果查看器的 UI:
此外,您还需要添加对位于 %ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies 文件夹的 LoadTestPackage DLL。
- 若要扩展 Web 性能测试结果查看器的 UI,必须创建 Visual Studio 外接程序和用户控件。 下面的过程说明如何创建外接程序、用户控件以及如何实现扩展 Web 性能测试结果查看器的 UI 所需的类。
要求
- Visual Studio 旗舰版
创建或打开一个包含 ASP.NET Web 应用程序,并且 Web 性能测试和负载测试项目的解决方案
准备扩展 Web 性能测试结果查看器
创建或打开可以测试的非生产解决方案中应包含一个 ASP.NET Web 应用程序,并且 Web 性能测试和负载测试与一个或多个 Web 项目针对 ASP.NET Web 应用程序性能测试。
备注
可以创建 ASP.NET Web 应用程序,并且 Web 性能测试和负载测试包含 Web 按照在 演练:创建简单的 Web 应用程序 和 演练:记录和运行 Web 性能测试的过程性能测试的测试项目。
创建 Visual Studio 外接程序
外接程序是在 Visual Studio 集成开发环境 (IDE) 中运行的已编译的 DLL。 编译有助于保护知识产权和提高性能。 虽然可以手动创建外接程序,但您可能会发现使用“外接程序向导”更为简便。 此向导创建一个功能全面但却很基本的外接程序,创建完该程序后可立即运行它。 “外接程序向导”生成基本程序后,可向其添加代码并对其进行自定义。
“外接程序向导”让您可以为外接程序提供显示名称和说明。 这两项内容都将出现在**“外接程序管理器”中。 还可以选择让向导生成代码,用于向“工具”菜单中添加可打开外接程序的命令。 您也可以选择为外接程序显示一个自定义“关于”**对话框。 当向导完成时,将生成只有一选件类实现外接程序的新项目。 该类名为“Connect”。
您将在本主题末尾使用**“外接程序管理器”**。
有关更多信息,请参见创建外接程序和向导。
使用“外接程序向导”创建外接程序
在解决方案资源管理器中,右击解决方案,选择 添加 然后选择 新建项目。
将显示“新建项目”对话框。
在**“已安装的模板”下,展开“其他项目类型”并选择“扩展性”**。
在模板列表中,选择**“Visual Studio 外接程序”**。
在“名称”下,键入外接程序的名称。 例如“WebPerfTestResultsViewerAddin”。
选择**“确定”**。
此时 Visual Studio 外接程序向导将启动。
选择**“下一步”**。
在**“选择编程语言”**页上,选择要用于编写外接程序的编程语言。
备注
本主题使用 Visual C# 编写代码示例。
在 选择应用程序主机 页上,选择 Visual Studio 和清除的 Visual Studio 宏。
选择**“下一步”**。
在**“输入名称和说明”**页中键入外接程序的名称和说明。
创建了外接程序后,其名称和说明将显示在**“外接程序管理器”的“可用外接程序”**列表中。 向外接程序的说明中添加足够的详细信息,以便用户能够了解外接程序的功能、工作方式等信息。
选择**“下一步”**。
在**“选择外接程序选项”页上,选择“我希望我的外接程序在宿主应用程序启动时加载”**。
清除其余复选框。
在**“选择‘帮助’中的‘关于’信息”页上,可指定是否将有关外接程序的信息显示在“关于”对话框中。 如果您确实希望显示此信息,则选中“是的,我希望我的外接程序提供‘关于’对话框信息”**复选框。
可以添加到 Visual Studio 的**“关于”**对话框中的信息包括版本号、支持详细信息和授权数据等信息。
选择**“下一步”**。
所选的选项将显示在**“摘要”**页上供您检查。 如果感到满意,请选择 完成 创建外接程序。 如果要更改某些内容,请选择 返回 按钮。
将创建新的解决方案和项目,并且新外接程序的 Connect.cs 文件将显示在代码编辑器中。
在完成下面的创建将由此 WebPerfTestResultsViewerAddin 项目引用的用户控件的过程后,您将向 Connect.cs 文件添加代码。
创建了外接程序后,必须先向 Visual Studio 注册此外接程序,然后才能在**“外接程序管理器”**中激活它。 使用具有 .addin 文件扩展名的 XML 文件来执行此操作。
.addin 文件描述了 Visual Studio 在**“外接程序管理器”中显示外接程序所需的信息。 在 Visual Studio 启动时,它会查找 .addin 文件位置,获取任何可用的 .addin 文件。 如果找到相应文件,则会读取 XML 文件,并向“外接程序管理器”**提供在单击外接程序进行启动时所需的信息。
使用外接程序向导创建外接程序时,会自动创建一个 .addin 文件。
有关更多信息,请参见外接程序注册。
外接程序文件位置
外接程序向导会自动创建 .addin 文件的两个副本,如下所示:
.Addin 文件位置 |
.Dll 文件位置 |
描述 |
---|---|---|
根项目文件夹 \Documents\Visual Studio 11\Projects\MyAddin1\MyAddin1\ |
本地路径 (MyAddin1.dll) |
用于部署外接程序项目。 包含在项目中以方便编辑,并使用本地路径安装以进行 XCopy 式部署。 |
外接程序文件夹 \Documents\Visual Studio 11\Addins\ - 或 - 共享文档位置\Addins\ |
项目调试文件夹 (例如,\ Documents\Visual Studio 11 Projects\MyAddin1\MyAddin1\bin\) |
用于在调试环境中运行外接程序。 应该始终指向当前生成配置的输出路径。 |
创建 Windows 窗体控件库项目
在前面过程中创建的 Visual Studio 外接程序将引用 Windows 窗体控件库项目来创建 UserControl 类的实例。
有关更多信息,请参见Windows 窗体控件。
创建要在 Web 测试结果查看器中使用的控件
在解决方案资源管理器中,右击解决方案,选择 添加 然后选择 新建项目。
将显示**“新建项目”**对话框。
在**“已安装的模板”下,展开“Visual Basic”或“Visual C#”,然后选择“Windows”**。
备注
本主题使用 Visual C# 编写代码示例。
在模板列表中,选择**“Windows 窗体控件库”**。
在**“名称”**下,键入外接程序的名称。 例如,WebPerfTestResultsViewerControl。
选择**“确定”**。
将在“解决方案资源管理器”中添加 Windows 窗体控件库项目 WebPerfTestResultsViewerControl,并在设计模式下显示 UserControl1.cs。
从“工具箱”中将 DataGridView 拖动到 userControl1 的图面上。
单击 DataGridView 的右上角的操作标记符号 (
),并按照以下步骤操作:
选择 在父容器中停靠。
清除**“启用添加”、“启用编辑”、“启用删除”和“启用列重新排序”**复选框。
选择 添加列。
将显示**“添加列”**对话框。
在**“类型”下拉列表中,选择“DataGridViewTextBoxColumn”**。
清除**“标题文本”**中的文本“Column1”。
单击**“添加”**。
选择**“关闭”**。
在“属性”窗口中,将 DataGridView 的**“(Name)”**属性更改为“resultControlDataGridView”。
右击设计图面并选择**“查看代码”**。
UserControl1.cs 文件将显示在代码编辑器中。
将实例化的 UserControl 类的名称从 UserContro1 更改为 resultControl:
namespace WebPerfTestResultsViewerControl { public partial class resultControl : UserControl { public resultControl() { InitializeComponent(); }
在下一过程中,您将向 WebPerfTestResultsViewerAddin 项目的引用 resultControl 类的 Connect.cs 文件添加代码。
您稍后将向 Connect.cs 文件添加一些附加代码。
向 WebPerfTestResultsViewerAddin 添加代码
向 Visual Studio 外接程序添加代码来扩展 Web 测试结果查看器
在解决方案资源管理器中,右击 WebPerfTestResultsViewerAddin 项目中的**“引用”节点,然后选择“添加引用”**。
在 添加引用 对话框中,选择 .NET 选项。
向下滚动并选择**“Microsoft.VisualStudio.QualityTools.WebTestFramework”和“System.Windows.Forms”**。
选择**“确定”**。
再次右击**“引用”节点,然后选择“添加引用”**。
在 添加引用 对话框中,选择 浏览 选项。
选择下拉式 查找范围 的并定位到 %ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies 并选择 Microsoft.VisualStudio.QualityTools.LoadTestPackage.dll 文件。
选择**“确定”**。
右击“WebPerfTestResultsViewerAddin”项目节点,然后选择**“添加引用”**。
在 添加引用 对话框中,选择 项目 选项。
在 项目名称下,选择 WebPerfTestResultsViewerControl 项目并选择 确定。
如果 Connect.cs 文件仍未打开,请在解决方案资源管理器中,右击“WebPerfTestResultsViewerAddin”项目中的**“Connect.cs”文件,然后选择“查看代码”**。
在 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;
向下滚动到 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>();
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); }
将下面的代码添加到 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); }
将下面的代码添加到 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); } }
将下面的代码添加到 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 窗体控件开发基础知识。
向用户控件添加代码
在“解决方案资源管理器”中右击 WebPerfTestResultsViewerControl 项目节点,然后选择**“属性”**。
选择 应用程序 选项并选择的 目标框架 下拉列表并选择的 .NET Framework 4 并关闭属性。
对为了支持 DLL 引用用于扩展 Web 需要性能测试结果查看器。
在解决方案资源管理器中,在 WebPerfTestResultsViewerControl 项目中右击**“引用”节点,然后选择“添加引用”**。
在**“添加引用”对话框中,单击“.NET”**选项卡。
向下滚动并选择**“Microsoft.VisualStudio.QualityTools.WebTestFramework”**。
选择**“确定”**。
在 UserControl1.cs 文件中,添加以下 Using 语句:
using Microsoft.VisualStudio.TestTools.WebTesting; using Microsoft.VisualStudio.TestTools.WebTesting.Rules;
添加 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 外接程序
使用外接程序管理器注册外接程序
在 工具 菜单中,选择 外接程序管理器。
将显示**“外接程序管理器”**对话框。
在**“可用外接程序”列中,选中 WebPerfTestResultsViewerAddin 外接程序对应的复选框,然后清除“启动”列和“命令行”**列下方的复选框。
选择**“确定”**。
有关更多信息,请参见如何:使用外接程序管理器控制外接程序。
使用“生成 WebPerfTestResultsViewerAddin 外接程序”运行 Web 性能测试
为 Web 测试结果查看器运行新的 VS 外接程序
运行 Web 性能测试,您将会看到在 Web 性能测试结果查看器中显示的 WebPerfTestResultsViewerAddin 外接程序的标题为“Sample”的新选项卡。
选择此选项卡可查看在 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 注册文件必须始终位于本地系统上。
有关更多信息,请参见外接程序安全性。
请参见
任务
参考
Microsoft.VisualStudio.TestTools.LoadTesting
Microsoft.VisualStudio.TestTools.WebTesting
Microsoft.VisualStudio.TestTools.WebTesting.Rules