Blue Dream

记录成长的每一个脚印,写下漫长的程序人生
  首页  :: 订阅 订阅  :: 管理

通过一个可配置的 Web 站点报告 Visual Studio Team System 的负载测试结果

发布日期: 2006-7-13 | 更新日期: 2006-7-13

本文讨论:

使用 Visual Studio 负载测试工具

负载测试报告的 Web 站点

测试报告站点的体系结构

使用和扩展测试报告站点

本文使用以下技术:
Visual Studio 2005、Team System 和 SQL Server 2005

代码下载位于:
LoadReporting2006_06.exe (332KB)

*
本页内容
使用负载测试工具 使用负载测试工具
负载测试报告站点 负载测试报告站点
报告站点体系结构 报告站点体系结构
负载测试运行的管理 负载测试运行的管理
SQL Server 报告页 SQL Server 报告页
进一步研究 进一步研究
小结 小结

Visual Studio 2005 Team System 内含一个新设计的负载测试工具。针对 Web 站点、Web 服务和其他服务器组件进行性能和压力测试,该新工具(以前的代号为"Ocracoke")提供了许多很不错的功能。此外,结合了自身便捷的报告功能,该负载测试工具为共享和管理测试结果提供了一些功能强大的选项。

该负载测试工具执行性能测试运行,并可配置为将数据记录到一个中心 SQL 数据库中。每个测试运行之后,您可以查看收集的测试数据(例如,性能计数器值、测试错误消息以及测试执行负载),然后从 Visual Studio® 2005 UI 内部分析测试数据。

我发现,在摘要视图中创建性能测试报告特别有帮助,因为这样可以显示关键的性能结果,例如,滞后时间数、测试负载、服务器的资源利用,以及执行中遇到的任何错误。这些性能报告可以通过其他计算机(该计算机可不安装 Visual Studio)上的 Web 浏览器查看。由于该负载测试工具可以在 SQL Server® 数据库中存储测试数据,因此用户可以直接连接到该数据库并在测试数据存储库内部创建多个自定义的性能测试报告。本文中,我将介绍一种方法来通过测试数据(由该负载测试工具生成)创建自定义的性能报告 Web 站点。

本文中讨论的报告站点(如图 1 所示)具有两个主要功能。第一个功能是:显示可从任何 Web 浏览器查看的性能测试运行报告。这些报告还可以导出到 Microsoft Excel® 或基于 Office Web 组件的 HTML 文档以进行电子邮件传输。对于每个测试运行,该站点都显示若干有用的报告,包括测试用例和事务的滞后时间数;性能计数器日志(显示所使用服务器的资源量,例如 CPU 和内存使用)的摘要和详细视图;测试负载信息(包括每秒请求数)以及错误消息。

第二个功能提供非常便利的管理功能。性能测试运行的数量随时间而增加,特别是当小组内有多个性能测试项目时。这可能导致在数据库中存储了数百个不同的性能测试运行,从而很难在 Visual Studio 中搜索信息或清除任何过期的测试运行。该示例 Web 站点使您能通过方案名或日期范围轻松地筛选测试运行,然后从数据库移除任何不需要的测试运行数据。其他有用的管理功能还包括编辑项目和方案名,添加分析注释。

使用负载测试工具

在开发一个高流量的 Web 站点、Web 服务或其他某些服务器组件时,了解站点或服务器可以处理的负载量十分重要。性能测试有助于确定该产品是否能满足性能目标。可使用负载测试工具(如 Visual Studio 2005 Team System 中提供的工具)模拟多个用户同时向服务发送请求。虽然我不打算介绍该工具中全部有趣的新功能,但是我会描述一些基本功能,它们有助于您了解该测试报告站点的工作方式。有关使用 Visual Studio 2005 负载测试工具的更多信息,请参阅 msdn2.microsoft.com/ms182561.aspx

该负载测试工具完全集成在 Visual Studio 2005 Team System 之中,因此您无需另外搜索并启动它。负载测试向导使您能轻松地创建一个负载测试项目。要启动一个性能测试运行,需要创建涵盖所需性能的测试方案的单元测试用例,然后创建一个负载测试项目。此时,您可以选择要对其运行性能测试的任何单元测试用例,并将它们添加到负载测试项目中。负载测试向导指导您进行需要的所有步骤,包括使用不同的运行设置创建多个性能测试方案。完成这些任务之后,可以运行针对性能测试的方案。

有两个可添加到负载测试项目的测试用例类型:Web 页测试和单元测试,包括任何功能代码或 Web 服务调用。要创建一个 Web 页负载测试,使用 Web Page Recorder 捕获在 Web 浏览器中执行的导航和用户输入。然后,记录的 Web 请求、传递的数据、查询字符串和 Cookie 由该负载测试工具进行复制。负载测试向导将指导您进行所有的重播设置:多少同步用户、浏览器类型的组合、运行持续时间、Web 请求间的思考时间、不同网络带宽的组合、需要收集的性能计数器类型等。

对于单元测试用例(例如,Web 服务调用或对服务器组件的调用)上的负载测试,可创建一个负载测试项目并将单元测试用例添加到其中。该负载测试向导指导您进行如前所述的那些设置。您可以选择不同的压力模式,包括一致的负载、步进负载等。负载测试可在单台测试客户端计算机上进行,或者从一组远程计算机(称为一个"rig")开始。一台控制器计算机用于控制该 rig 上的测试运行,收集来自远程客户端的所有性能测试数据,并将所有数据放到结果数据库。

该负载测试工具能够收集远程服务器上多种类型的测试数据,并将数据记录到数据库中。对于性能测试报告,重要的是了解负载测试运行之后收集的测试数据类型。通常有四种类型的信息需要添加到报告中:

每种请求的滞后时间

吞吐量信息,或者该服务器接收的负载量(例如,每秒的请求)

服务器端资源利用率(例如,CPU 使用率、内存使用率等)

测试运行配置(例如,测试持续时间、同步用户数等)

还有其他可以记录到结果数据库中的有用信息类型。包括遇到的任何错误消息以及 SQL Server 跟踪信息,该信息能帮助发现测试运行过程中最慢的那个查询或存储过程。

负载测试报告站点

我的负载测试报告 Web 站点旨在提供大量有用的功能,这些功能有助于您运行测试并创建报告。首先,它有一个分层结构,通过该结构能轻松地在测试运行之间进行导航。该站点通过日期范围组织测试运行 - 这是一个能够让发现和管理测试更容易的方法。它能够轻松地修改重要信息,例如,项目和方案名、测试描述和分析注释。此外,我的报告 Web 站点提供多种测试报告,包括一个摘要报告、一个详细的性能计数器报告和一个 Web 页性能测试报告。(注意,我的示例站点使用 Scott Mitchell 的 RoundedCorners Web 控件,有关这一点的更多信息,请参阅 aspnet.4guysfromrolla.com/articles/072804-1.aspx。)

在图 1 中主页的左边,一个树视图导航控件列出数据库中所有进行了负载测试的项目。单击该树视图中的一个特定项目名时,该项目的所有方案和测试运行都显示在右窗格中。项目名(数据库表中的 LoadTestName 字段)、方案名和 RunIds 之间的关系类似于分支树结构。一个项目可以包含多个方案。对于一个测试方案,可执行多个测试运行。在树视图控件中,有一个用于筛选要显示的测试运行数的下拉列表控件。要限制该页上显示的测试运行数,通过指定日期而从只显示近几天发生的测试运行。


图 1 负载测试报告站点

在主页的右边,Results 列为每个运行提供三个链接:Summary(显示测试摘要报告,如图 2 所示)、LoadChart(显示用户负载图)以及 PageResults(显示 Web 请求测试的结果)。Edit 链接使您能够修改一个特定运行的项目名、方案名、测试运行描述和分析注释,Delete 链接使您能够从数据库中删除特定运行的所有记录的测试数据。


图 2 测试摘要报告

报告站点体系结构

用于构建报告 Web 站点的设计体系结构,如图 3 所示。这些 Web 页使用 ASP.NET Web 控件生成,而这些控件绑定到结果数据库中的数据。对于所有测试报告,用 SQL Server 报表定义语言 (RDL) 从数据库读取数据并创建报告页。若干新的存储过程和视图创建到在该数据库中,并由这些 Web 控件使用。我的站点利用了 SQL Server Reporting Services 提供的很多功能,例如,将报告导出为其他格式。


图 3 报告站点体系结构

即使使用该报告站点,仍然需要 Visual Studio 2005 Team System 来运行负载测试,并配置测试运行,从而将原始数据记录到一个集中的 SQL 数据库中。但通过使用该站点体系结构,您可以轻松地自定义自己的报告页设计方法 - 修改示例报告设计或创建您自己的报告。

该示例解决方案包括一个 ASP.NET 站点安装项目 WebSetup_PerfReport,您可利用它在任何主机服务器(具有 IIS 和 ASP.NET 2.0)上安装 Web 站点。SQL Server RDL 文件用来生成测试报告。但当您编译这些示例项目并安装报告 Web 站点之前,需要一些安装步骤。(请参阅代码下载以获取详细信息。)

完成报告的 Web 站点以从 SQL 数据库获取测试结果数据并创建测试报告的安装之后,则可测试报告站点并开始编写 Web 测试或单元测试用例,并将它们添加到一个负载测试项目中。在运行负载测试项目后,检查该测试运行是否显示在报告站点中。如前所述,您可以在测试运行后立即使用 Visual Studio 2005 查看测试结果。报告站点的优势在于,只需在任何计算机上使用一个 Web 浏览器,即可得到摘要报告和详细的性能测试报告。

要通过直接从负载测试数据库访问测试数据来编写您自己的测试报告,需要了解基本的表结构、存储过程和视图。由于负载测试工具在内部将数据记录到表中,因此,更改表的设计或结构可能会潜在地破坏测试工具。因此,您需要将自己的方法应用到 Visual Studio 所需的表结构。例如,在示例报告站点中,所有测试项目的测试运行均通过一个具有分层结构的树视图进行组织,例如,项目名/方案名/运行 ID。但是,LoadTest 数据库只包含字段 ScenarioName 和 RunId。幸运的是,您可以使用 LoadTestName 字段作为项目名,以满足报告的需要。

使用自定义存储过程的示例显示在主页的右边(如图 1 所示),其中 ASP.NET DataGrid 控件绑定到从以下存储过程返回的测试数据:

CREATE PROCEDURE Prc_SelectLoadTestSummary
@LoadTestName nvarchar(255)
AS
SELECT  ScenarioName, LoadTestRunId, Description, StartTime,
EndTime, RunDuration, Outcome
FROM    dbo.LoadTestSummary
WHERE   LoadTestName = @LoadTestName

负载测试运行的管理

通常情况下,您会管理大量性能测试运行,包括针对每个项目的若干性能测试方案。因此,导致大量测试运行记录到结果数据库中。其中的一些结果可能没有用,您可能想从该数据库中移除它们。对于更多的相关测试运行,您可能想添加分析注释,以便总结您观察到的信息并在测试报告中呈现它们。

新负载测试工具的一个优秀的新功能是:对于每个性能测试运行,可将自己的分析注释添加到表 LoadTestRun 的注释字段中。该注释存储在数据库中的每个测试运行之后,其中您可以分析数据并将有关性能测试运行的结果添加到数据库中。

图 4 中显示的页旨在允许用户修改报告站点上的测试信息。该页可通过单击主页上的 Edit 链接启动。要更改项目名,可以输入新名称,或者从下拉控件中选择任何现有项目名。也可以编辑测试方案名、测试运行描述以及同一页中的分析注释。当某个测试运行标识为最后的测试运行,而且您想与小组成员共享结果时,该功能特别有用。单击 Update 按钮后,该数据库将用新的信息进行更新。


图 4 更新测试运行信息

如果您发现某些测试运行不值得保留在数据库中,则可以有若干种方法移除它们。一种方法是通过报告站点,您可简单地单击主页上的 Delete 链接。该链接通过传递一个相应于单击的 DataGrid 行的测试 RunId 参数,在内部调用一个存储过程 Prc_DeleteLoadTestRun。

需要注意报告站点的删除操作,因为访问该页的任何用户都可通过单击 Delete 在无意中移除测试运行。但有几种方法可以防止这一点。例如,可添加身份验证逻辑以限制对提供删除或编辑操作的关键页的访问。

也可通过使用自己的存储过程同时移除多个测试运行。此类存储过程的一个示例是,移除一个范围 (Prc_DeleteLoadTestRunFromIds) 内的所有测试运行 ID 的测试数据:

CREATE PROCEDURE Prc_DeleteLoadTestRunFromIds
@LoadTestRunStartId int,
@LoadTestRunEndId int
AS
BEGIN
DECLARE @LoadTestRunId int
SET     @LoadTestRunId = @LoadTestRunStartId
WHILE   @LoadTestRunId <= @LoadTestRunEndId
BEGIN
EXEC Prc_DeleteLoadTestRun @LoadTestRunId
SET  @LoadTestRunId = @LoadTestRunId + 1
END
END
GO

例如,要移除 ID 12 到 20 的测试结果,只需运行以下代码:

EXEC Prc_DeleteLoadTestRunFromIds 12, 20

SQL Server 报告页

从测试报告主页,是单击 Summary、LoadChart 或 PageResults,可打开一个测试运行的三个报告页。DataGrid 控件的后台代码重定向对相应报告服务页的请求,如图 5 所示。在该示例项目中,这三个报告使用 LoadTestSummary.rdl、PagePerformanceOverTime.rdl 和 RequestPerformanceDetails.rdl 进行设计。

性能测试报告的关键内容是每个测试服务器上的系统资源利用率。在图 2 所示的报告摘要页中,您将看到一个称为 System Resource Usage 的部分。在这一部分中,报告了若干重要的性能计数器类别。如果对于在摘要报告中添加更多预选择的性能计数器实例或类别感兴趣,可在报告 LoadTestSummary.rdl 的数据源中修改 SQL 查询,如图 6 所示。

在 System Resource Usage 区域中,也可单击每个性能计数器类别名,跳到性能计数器值(该值位于所有测试服务器上的类别中)的更详细的报告。该功能通过显示涉及到的所有服务器的值,深入挖掘了该类别中更多的性能计数器实例。例如,通过单击 System 链接,可获取系统资源的详细报告页。对于 System 类别下所有涉及到的测试服务器,该报告页显示所有的性能计数器实例。当您想分析特定性能计数器类别的更多详细性能计数器数据时,这尤其有用。该报告在 SystemResourceUsageDetail.rdl 中。

如果在 Web 页性能测试的负载测试项目中使用 WebRequest,可单击 PageResults 链接查看 Web 页结果报告。这会弹出一个列出关于某个 Web 请求的所有测试信息的报告页。如果有多个性能测试 Web 页,则可获取多个行。用于 Web 请求报告的 RDL 文件是 RequestPerformanceDetails.rdl。

运行一个负载测试后,以平均值显示测试用例和事务的响应时间和滞后时间数。Test Case 列中的数据表示代码中以 [TestMethod] 属性标记的任何函数的运行时间,如下所示:

[TestMethod]
public void SubmitEventWithEmail() {
SubmitEvent(false);
}
[TestMethod]
public void SubmitEventWithPuid() {
SubmitEvent(true);
}

上面的代码中有两个使用了 [TestMethod] 属性进行标记的函数,因此这两个函数的滞后时间数据和响应时间反应在 Test Case 列中。响应时间表示整个函数的全部滞后时间。

测量一个大函数中的任何子函数调用的滞后时间十分重要。这可通过以下方法实现:在代码中使用 BeginTimer 和 EndTimer 函数测量在任何给定函数上使用的时间。其中的一个示例如图 7 所示。在该代码中,滞后时间数据将针对由以 BeginTimer 和 EndTimer 包围的任何函数进行收集。滞后时间数在页结果的 Transaction 部分中报告。

进一步研究

当能够生成您的性能测试报告站点之后,可进行很多操作对其进行改进。可添加一个 SQL Trace 报告。如果能够在负载测试项目中启用 SQL Trace Tracking,即可在 LoadTest 数据库中获取 SQL 查询命令或存储过程的执行时间信息。基于来自示例测试运行的 SQL Trace 数据,可创建一个报告来按滞后时间显示经过排序的存储过程,从而能够找出测试运行中最慢的存储过程。

对这两个性能运行进行并列对比也非常有益,因为这样您就能够查看一个版本的新版本是否比以前的版本具有更好的性能。在单一 Web 页上,可以显示两个版本间的性能差异(例如,滞后时间或 CPU 使用率)。通过这种方式,可立即对比这两个运行的性能并找出需要进一步研究的领域。

我在本文中讨论的报告站点显示了响应时间和性能计数器的平均值。如果您喜欢使用百分比(而不是平均值)表示性能测试数据,请参阅 www.seanadams.com/95 获取更多信息。百分比数据具备提供统计信息的优势。

使用该负载测试工具的默认配置,则不收集百分比数据。为了启用百分比计算,必须在负载测试项目中更改 Run Settings 的属性 Timing Details Storage of Run Settings。有关该设置以及其他有用技术的更多信息,请访问 Bill Barnett 的网络日记。百分比数据记录到一个称为 LoadTestTransactionSummaryData 的表中。可以修改 SQL 报告的设计架构,以便包含关于报告页的百分比信息。注意,启用该操作会将其他数据添加到数据库中,而且将使用更多的磁盘空间。

最后,不同于功能测试用例,性能测试运行并不总是判定为通过或失败。有时,您只想收集基准性能数字。但在其他情况中,您可能对可接受和不可接受的滞后时间或 CPU 使用率有性能上的要求。如果测试运行性能超出可接受的范围,则测试基本上是失败了。为了确定一个性能测试运行是否满足性能要求,可修改当前的报告设计架构和 Web 控件,以便将这种结果信息添加到一个特定的测试运行中。

小结

Visual Studio 2005 Team System 集成了一个方便的新负载测试工具,使您能够运行可自定义的测试并收集关键数据。此外,其他功能(例如,测试报告 Web 站点的功能)使您能够进一步深挖内置的负载测试以获取更多内容。掌握测试报告 Web 站点功能之后,就可更轻松地共享测试结果,分析数据以及管理存储测试结果。

Wen Ding 供职于 Microsoft,他负责为 microsoft.com 站点上使用的很多项目进行软件性能测试和优化。您可通过 dingwen@microsoft.com 与他联系。