在本演练中,您将创建一个 ASP.NET Web 应用程序,其中包含用于产生无法检测的动态参数错误的自定义代码。 您将了解如何隔离并更正此类错误。
有些网站和应用程序在其一个或多个 Web 请求中使用动态参数。 “动态参数”是指其值在用户每次运行应用程序时生成的参数。 动态参数可能会导致 Web 性能测试播放失败,因为每次运行该测试时动态值都可能有所不同。 因此,您无法播放记录的值。 动态参数的一个示例就是会话 ID。 它的值每 5 至 30 分钟更改一次。
Web 性能测试记录器和播放引擎可自动处理最常见的动态参数类型:
在 Cookie 值中设置的动态参数值。 Web 性能测试引擎会在播放时自动处理这些参数值。
在 HTML 页的隐藏字段中设置的动态参数值,如 ASP.NET 视图状态。 这些参数值由 Web 性能测试记录器自动处理。 Web 性能测试记录器向测试中添加隐藏字段提取规则。
设置为查询字符串或窗体发布参数的动态参数值。 这些参数值在测试完成时通过动态参数检测进行处理。
但是,仍有一些形式的动态参数不会自动进行处理。 为正确处理这些参数,可以在 Web 性能测试中向动态参数添加提取规则。 但是,在添加提取规则之前,必须先找到初始化动态参数的位置。 本演练演示如何找到并更正一个模拟的无法检测的会话 ID 动态参数错误。
在本演练中,您将完成以下任务:
创建 ASP.NET Web 应用程序。
向该应用程序添加一些 ASP.NET 页。
向该应用程序中添加一些控件。
修改 ASP.NET 代码。
添加一些 C# 隐藏代码。
添加用于产生无法检测的动态参数的 Javascript。
对该应用程序记录新的 Web 性能测试并注意检测到的 ASP.NET 动态属性。
运行该 Web 性能测试,并注意该测试具有一个无法检测的动态参数。
在播放期间在 Web 性能测试结果查看器中使用快速查找来隔离动态参数错误。
向该动态参数添加一个提取规则。
在 Web 性能测试编辑器中,将该提取规则绑定到动态参数。
重新运行该 Web 性能测试,并且不发生任何错误。
系统必备
- Microsoft Visual Studio 2010 旗舰版.
创建 Web 应用程序
创建 Web 应用程序
在 Visual Studio 2010 旗舰版的**“文件”菜单中,单击“新建”,然后单击“项目”**。
此时将出现**“新建项目”**对话框。
在**“已安装的模板”下,展开所需的编程语言,然后单击“Web”**。
在 Web 项目类型的列表中,选择**“ASP.NET 空 Web 应用程序”**。
在“名称”框中,键入 DynamicParameterSample。
在**“位置”**框中,指定要用于创建 Web 应用程序的文件夹。
选择**“创建解决方案的目录”**。
单击**“确定”**。
在**“项目”菜单上选择“添加新项”**。
将显示**“添加新项”**对话框。
在项列表中选择**“Web 窗体”**。
在**“名称”文本框中,键入 Querystring.aspx,然后单击“添加”**。
向 Querystring.aspx 页添加 HiddenField 控件
向 Querystring.aspx 页添加 HiddenField 控件
在解决方案资源管理器中,右击 Querystring,然后选择**“视图设计器”**。
随即显示一个空白页。
如果工具箱不可见,请单击**“视图”,再单击“工具箱”**。
从**“标准”组将“HiddenField”**拖到该页上。
将向设计图面添加一个 HiddenField 控件。
在页面上单击该 HiddenField 控件,然后在“属性”窗口的**“杂项”类别中,将“(ID)”**更改为 HiddenFieldSessionID。
在**“文件”菜单上,单击“全部保存”**。
向 Querystring.aspx 页添加代码
向 Querystring.aspx 页添加代码
在 Querystring 页的底部,单击**“源”**。
将显示代码编辑器,其中包含 Querystring.aspx 页的 ASP.NET 代码。
添加下面突出显示的 ASP.NET 和 JavaScript 代码,这些代码用于生成模拟的会话 ID 动态参数:
<head runat="server"> <title>Javascript dynamic property correlation sample</title> <script type="text/javascript" language="javascript"> <!-- function jScriptQueryString() { var Hidden = document.getElementById("HiddenFieldSessionID"); var sessionId = Hidden.value; window.___location = 'JScriptQuery.aspx?CustomQueryString=jScriptQueryString___' + sessionId; } //--> </script> </head> <body> <form id="form1" runat="server"> <div> <a name="QuerystringHyperlink" href="ASPQuery.aspx?CustomQueryString=ASPQueryString___<%= Session.SessionID %>">Dynamic querystring generated by ASP.net</a> <br/> <br/> <a href="javascript:jScriptQueryString()">Dynamic querystring generated by javascript </a> </div> <asp:HiddenField ID="HiddenFieldSessionID" runat="server" /> </form> </body> </html>
右击 Querystring 页,然后选择**“查看代码”**。
将显示代码编辑器,其中包含 Querystring.aspx 页的 Visual C# 隐藏代码。
将下面突出显示的代码添加到 Page_Load 方法中:
public partial class Querystring : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { Session.Add("Key", "Value"); HiddenFieldSessionID.Value = Session.SessionID; } }
在**“文件”菜单上,单击“全部保存”**。
添加 ASPQuery.aspx 页、控件和代码
向 Web 应用程序添加 ASPQuery.aspx 页
在**“项目”菜单上,单击“添加新项”**。
在**“添加新项”对话框中,单击“Web 窗体”模板,在“名称”中键入 ASPQuery.aspx,然后单击“添加”**。
在**“文件”菜单上,单击“全部保存”**。
向 ASPQuery.aspx 页添加控件
在解决方案资源管理器中,右击 ASPQuery.aspx,然后选择**“视图设计器”**。
随即显示一个空白页。
在**“工具箱”的“标准”组中,将一个“标签”**拖到页上。
随即向设计图面添加一个标签控件。
在页面上单击该标签,然后在“属性”窗口的**“杂项”类别中,将“(ID)”**的值更改为 IndexLabel。
从**“工具箱”的“标准”组,将一个“超链接”**拖到页上。
随即向设计图面添加一个超链接控件。
在页面上单击该超链接,然后在“属性”窗口的**“外观”类别中,将“文本”**的值更改为 Back。
在“导航”类别中,单击**“NavigationURL”属性的 (…**)。
此时会显示**“选择 URL”**对话框。
在**“文件夹内容”下的页列表中,选择 Querystring.aspx,然后单击“确定”**。
在**“文件”菜单上,单击“全部保存”**。
向 ASPQuery.aspx 页添加隐藏代码
右击 ASPQuery 页,然后选择**“查看代码”**。
将显示代码编辑器,其中包含 ASPQuery.aspx 页的 Visual C# 隐藏代码。
将下面突出显示的代码添加到 Page_Load 方法中:
protected void Page_Load(object sender, EventArgs e) { int index; string qstring; string dateportion; string sessionidportion; qstring = Request.QueryString["CustomQueryString"]; index = qstring.IndexOf("___"); dateportion = qstring.Substring(0, index); index += 3; sessionidportion = qstring.Substring(index, qstring.Length - index); if (sessionidportion != Session.SessionID) { Response.StatusCode = 401; IndexLabel.Text = "Failure! Invalid querystring parameter found."; } else { IndexLabel.Text += "Success. Dynamic querystring parameter was found."; } IndexLabel.Text += "<br>\r\n"; }
在**“文件”菜单上,单击“全部保存”**。
添加 JScriptQuery.aspx 页、控件和代码
向 Web 应用程序添加 JScriptQuery.aspx 页
在**“项目”菜单上,单击“添加新项”**。
在**“添加新项”对话框中,单击“Web 窗体”模板,在“名称”中键入 JScriptQuery.aspx,然后单击“添加”**。
在**“文件”菜单上,单击“全部保存”**。
向 JScriptQuery.aspx 页添加控件
在解决方案资源管理器中,右击 JScriptQuery.aspx,然后选择**“视图设计器”**。
随即显示一个空白页。
在**“工具箱”的“标准”组中,将一个“标签”**拖到页上。
随即向设计图面添加一个标签控件。
在页面上单击该标签,然后在“属性”窗口的**“杂项”类别中,将“(ID)”**的值更改为 IndexLabel。
从**“工具箱”的“标准”组,将一个“超链接”**拖到页上。
随即向设计图面添加一个超链接控件。
在页面上单击该超链接,然后在“属性”窗口的**“外观”类别中,将“文本”**的值更改为 Back。
在“导航”类别中,单击**“NavigationURL”属性的 (…**)。
此时会显示**“选择 URL”**对话框。
在**“文件夹内容”下的页列表中,选择 Querystring.aspx,然后单击“确定”**。
在**“文件”菜单上,单击“全部保存”**。
向 JScriptQuery.aspx 页添加隐藏代码
右击 JScriptQuery 页,然后选择**“查看代码”**。
将显示代码编辑器,其中包含 JScriptQuery.aspx 页的 Visual C# 隐藏代码。
将下面突出显示的代码添加到 Page_Load 方法中:
protected void Page_Load(object sender, EventArgs e) { int index; string qstring; string dateportion; string sessionidportion; qstring = Request.QueryString["CustomQueryString"]; index = qstring.IndexOf("___"); dateportion = qstring.Substring(0, index); index += 3; sessionidportion = qstring.Substring(index, qstring.Length - index); if (sessionidportion != Session.SessionID) { Response.StatusCode = 401; IndexLabel.Text = "Failure! Invalid querystring parameter found."; } else { IndexLabel.Text += "Success. Dynamic querystring parameter was found."; } IndexLabel.Text += "<br>\r\n"; }
在**“文件”菜单上,单击“全部保存”**。
手动测试 Web 应用程序
手动测试 Web 应用程序
在**“解决方案资源管理器”中,右击 Querystring.aspx,然后单击“设为起始页”**。
按 Ctrl+F5 在浏览器中运行该 Web 应用程序。 您将看到第一页。
单击**“Dynamic querystring generated by ASP.NET”(由 ASP.NET 生成的动态查询字符串)**链接。
将显示 ASPQuery.aspx 页,并显示消息“Success. Dynamic querystring parameter found.”(成功。已找到动态查询字符串参数。)
单击**“Back”(后退)**链接。
单击**“Dynamic querystring generated by javascript”(由 Javascript 生成的动态查询字符串)**链接。
将显示 JScriptQuery.aspx 页,并显示消息“Success. Dynamic querystring parameter found.”(成功。已找到动态查询字符串参数。)
单击**“Back”(后退)**链接。
将您的 Web 应用程序的地址复制到剪贴板或记事本文件中。 例如,该地址可能如下所示:
https://localhost:<端口号>/Querystring.aspx。
在本演练的后面创建 Web 性能测试时,将需要使用该 URL。
创建测试项目
创建测试项目
在**“文件”菜单上指向“添加”,然后单击“新建项目”**。
随即出现**“添加新项目”**对话框。
在**“已安装的模板”下,展开“Visual C#”,然后选择“测试”**。
在模板列表中,选择**“测试项目”**。
在**“名称”**框中,键入 DynamicParameterSampleTest。
单击**“确定”**。
提示
默认情况下,Visual Studio 2010 旗舰版 将添加一个单元测试文件。 本演练不需要该单元测试文件。 因此,可以将该文件删除。 如果您不删除该文件,它也不会影响演练。
记录 Web 性能测试并自动检测 ASPQuery.aspx 页的动态参数
记录 Web 性能测试
在**“测试”菜单上,单击“新建测试”**。
随即出现**“添加新测试”**对话框。
在**“添加新测试”对话框中,选择“Web 性能测试”,将该测试命名为 DynamicParameterSampleApp.webtest,然后单击“确定”**。
将向该项目添加一个名为**“DynamicParameterSampleApp.webtest”的新 Web 性能测试文件,并在 Internet Explorer 的新实例中打开“Web 性能测试记录器”**。
警告
为使下一个过程正常执行,必须按照如下顺序执行这些步骤。
在浏览器的地址栏中,键入或粘贴在该过程的手动测试 Web 应用程序步骤中复制的 Web 应用程序地址,然后按 Enter。
提示
Visual Studio 2010 旗舰版会在记录 Web 性能测试的同时开始将它的 URL 显示在“Web 性能测试记录器”中。
单击**“Dynamic querystring generated by ASP.NET”(由 ASP.NET 生成的动态查询字符串)**链接。
将显示 ASPQuery.aspx 页,并显示消息“Success. Dynamic querystring parameter found.”(成功。已找到动态查询字符串参数。)
单击**“Back”(后退)**链接。
单击**“Dynamic querystring generated by javascript”(由 Javascript 生成的动态查询字符串)**链接。
将显示 JScriptQuery.aspx 页,并显示消息**“Success.已找到动态查询字符串参数**。
单击**“Back”(后退)**链接。
若要停止记录,请在**“Web 性能测试记录器”中单击“停止”**。
对话框显示消息**“正在检测动态参数”**。 还显示一个进度栏,该进度栏说明了在接收到的 HTTP 响应中的参数检测状态。
接下来,将显示**“将动态参数提升为 Web 测试参数”**对话框。
由于自动检测到在该过程中为 ASPQuery 页中 CustomQueryString 中的动态参数添加的自定义代码,因此该代码将列在对话框中。
未自动检测到 JScriptQuery 页中 CustomQueryString 的动态参数,因为在向 Querystring.aspx 页添加代码过程中将自定义 Javascript 代码添加到了 Querystring.aspx 页。
单击**“确定”**向 Querystring.aspx 添加提取规则。
将显示 Web 性能测试编辑器,其中完全展开了 Querystring.aspx 的第一个请求。 该请求显示了已添加的提取规则。
在 ASPQuery.aspx 的请求树中完全展开第二个请求,您会看到 CustomQueryString 的值已绑定到该提取规则。
选择**“文件”,然后选择“保存 DynamicParameterSampleApp.webtest”**以保存新记录的 Web 性能测试。
播放该 Web 性能测试以产生无法检测的动态参数错误。
播放 Web 性能测试
在**“Web 性能测试编辑器”中,单击工具栏上的“运行”**以显示 Web 性能测试结果查看器。
您会看到第四个请求失败并含有一个错误。 第四个请求针对 JScriptQuery.aspx 页。
隔离导致错误的动态参数
在播放录制中使用“快速查找”
在 Web 性能测试结果查看器中,右击第四个请求。 由于发生动态参数问题,因此第四个请求针对已失败的 JScriptQuery.aspx 页。 选择**“转到 Web 测试”**。
此时将显示 Web 性能测试编辑器,其中突出显示了 JScriptQuery.aspx 请求。
完全展开该请求节点,您会看到以下 CustomQueryString 的“wy0zaykqadkoscuvoiqemofm”部分看上去是动态的:“CustomQueryString=jScriptQueryString___wy0zaykqadkoscuvoiqemofm”。
返回到 Web 性能测试结果查看器,然后选择失败的 JScriptQuery.aspx 页。
单击**“请求”**选项卡。
确认已清除**“显示原始数据”**复选框。
向下滚动,直至在**“名称”列下找到“QueryString 参数”**。
右击**“CustomQueryString”,然后选择“快速查找”**。
在**“查找”对话框中,参数值显示在“查找内容”**下。
在本例中,您可通过在 Web 性能测试编辑器中查看而了解到,已向 JScriptQuery.aspx 请求的 CustomQueryString 赋予 jScriptQueryString___wy0zaykqadkoscuvoiqemofm 的值,并且怀疑是动态的部分为“wy0zaykqadkoscuvoiqemofm”。
在**“查找内容”**下拉列表中,移除该搜索字符串的可疑部分。 该字符串应为“CustomQueryString=jScriptQueryString___”。
动态参数将存在错误的请求前面的一个请求中进行赋值。 因此,请选中**“向上搜索”复选框,然后单击“查找下一个”,直到 Querystring.aspx 前面的请求突出显示在“请求”面板中。 这种情况应在单击“查找下一个”**三次后发生。
正如您在本例中以及此前实现的 Javascript 中所看到的,将向查询字符串参数 CustomQueryString 赋予“jScriptQueryString___”的值,并且该字符串参数还会与变量 sessionId 的返回值串联。
function jScriptQueryString() { var Hidden = document.getElementById("HiddenFieldSessionID"); var sessionId = Hidden.value; window.___location = 'JScriptQuery.aspx?CustomQueryString=jScriptQueryString___' + sessionId; }
现在您已知道发生错误的位置,并且还知道需要提取 sessionId 的值。 但是,提取值是纯文本,因此您需要通过尝试找到显示 sessionId 的实际值的字符串来进一步隔离该错误。 通过查看代码,可以看到变量 sessionId 等于 HiddenFieldSessionID 所返回的值。
突出显示 HiddenFieldSessionID,右击并选择**“快速查找”**。
在**“查找”对话框中,清除“向上搜索”复选框,然后选择“当前请求”**。
单击**“查找下一个”**。
将在下面一行中突出显示 HiddenFieldSessionID 的第一个匹配项。 还可以看到赋给该匹配项的值:
<input type="hidden" name="HiddenFieldSessionID" id="HiddenFieldSessionID" value="0rvcxknlabd30xnbrjtuy11u" />
您会看到,该返回值与原始 Web 性能测试记录中的返回值不是同一字符串。 在此播放中,该值为“0rvcxknlabd30xnbrjtuy11u”,而在记录中,该值为“wy0zaykqadkoscuvoiqemofm”。 由于该值与原始记录不匹配,因此将会产生错误。
从录制的播放添加提取规则
在 Web 测试结果查看器的工具栏中,单击**“记录的结果”**。
该 Web 性能测试的原始记录结果显示在一个名为**“DynamicParameterSampleApp[Recorded]”**的单独选项卡上。
如果尚未选择第三个请求,请选择该请求。 它是在上一步中隔离的 Querystringrequest.aspx。
单击**“响应”选项卡。 向下滚动,突出显示在上一过程中隔离的“wy0zaykqadkoscuvoiqemofm”的原始动态参数值。 右击该参数值,然后选择“添加提取规则”**。
此时将显示 Web 性能测试编辑器,其中,新提取规则在 Querystring.aspx 请求中已处于选中状态。 将把“Param0”的值赋给新提取规则。
显示**“Microsoft Visual Studio”**对话框,指明已为该参数绑定到的已提取文本找到匹配项。
单击**“是”**。
将显示**“请求中的查找和替换”对话框,在该对话框的“查找内容”下拉列表中显示了已提取的文本“wy0zaykqadkoscuvoiqemofm”,并在“替换为”下拉列表中显示了参数“{{Param0}}”**。
单击**“查找下一个”**。
将突出显示 JScriptQuery.aspx 请求 **“CustomQueryString=jScriptQueryString___wy0zaykqadkoscuvoiqemofm”**下的 QueryString 参数。
单击**“替换”**。
JScriptQuery.aspx 请求下的 QueryString 参数将使用新的上下文参数**“CustomQueryString=jScriptQueryString___{{Param0}}”**进行更新。
请注意,检测到的动态参数与关联的未检测到的动态参数具有类似的请求树结构。