逐步解說:讓動態參數相互關聯
在本逐步解說中,您會建立包含自訂程式碼的 ASP.NET Web 應用程式,此程式碼會建立無法偵測到的動態參數錯誤。 您將學習如何找出這類錯誤並加以更正。
部分網站和應用程式在一個或多個 Web 要求中使用動態參數。 「動態參數」(Dynamic Parameter) 是每次使用者執行應用程式時將產生值的參數。 由於每次執行測試時動態的值可能會不同,動態參數可導致 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 Ultimate。
建立 Web 應用程式
建立 Web 應用程式
在Visual Studio 2010 Ultimate 的 [檔案] 功能表上,按一下 [新增],然後按一下 [專案]。
[新增專案] 對話方塊隨即出現。
在 [已安裝的範本] 下方,展開您偏好的程式語言,然後按一下 [Web]。
在 Web 專案類型的清單中,選取 [ASP.NET 空白 Web 應用程式]。
在 [名稱] 方塊中,輸入 DynamicParameterSample。
在 [位置] 方塊中,指定您想要儲存 Web 應用程式的資料夾。
選取 [為方案建立目錄]。
按一下 [確定]。
在 [專案] 功能表上,選擇 [加入新項目]。
[加入新項目] 對話方塊隨即出現。
在項目清單中,選擇 [Web Form]。
在 [名稱] 文字方塊中,輸入 Querystring.aspx,然後按一下 [加入]。
將 HiddenField 控制項加入至 Querystring.aspx 頁面
將 HiddenField 控制項加入至 Querystring.aspx 頁面
在 [方案總管] 中,以滑鼠右鍵按一下 [Querystring.aspx],然後選擇 [設計工具檢視]。
空白頁面隨即出現。
如果沒看到工具箱,請按一下 [檢視],然後按一下 [工具箱]。
從 [標準] 群組中,將 [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 頁面、控制項和程式碼
將 ASPQuery.aspx 頁面加入至 Web 應用程式
在 [專案] 功能表上按一下 [加入新項目]。
在 [加入新項目] 對話方塊中,按一下 [Web Form] 範本並在 [名稱] 中輸入 ASPQuery.aspx,然後按一下 [加入]。
在 [檔案] 功能表上,按一下 [全部儲存]。
將控制項加入至 ASPQuery.aspx 頁面
在 [方案總管] 中,以滑鼠右鍵按一下 [ASPQuery.aspx],然後選擇 [設計工具檢視]。
空白頁面隨即出現。
從 [工具箱] 的 [標準] 群組中,將 [Label] 拖曳到頁面上。
Label 控制項便會加入至設計介面中。
按一下頁面上的 [Label],然後在 [屬性] 視窗的 [其他] 分類中,將 [(ID)] 的值變更為 IndexLabel。
從 [工具箱] 的 [標準] 群組中,將 [HyperLink] 拖曳到頁面上。
HyperLink 控制項便會加入至設計介面中。
按一下頁面上的 [HyperLink],然後在 [屬性] 視窗的 [外觀] 分類中,將 [Text] 的值變更為 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 頁面、控制項和程式碼
將 JScriptQuery.aspx 頁面加入至 Web 應用程式
在 [專案] 功能表上按一下 [加入新項目]。
在 [加入新項目] 對話方塊中,按一下 [Web Form] 範本並在 [名稱] 中輸入 JScriptQuery.aspx,然後按一下 [加入]。
在 [檔案] 功能表上,按一下 [全部儲存]。
將控制項加入至 JScriptQuery.aspx 頁面
在 [方案總管] 中,以滑鼠右鍵按一下 [JScriptQuery.aspx],然後選擇 [設計工具檢視]。
空白頁面隨即出現。
從 [工具箱] 的 [標準] 群組中,將 [Label] 拖曳到頁面上。
Label 控制項便會加入至設計介面中。
按一下頁面上的 [Label],然後在 [屬性] 視窗的 [其他] 分類中,將 [(ID)] 的值變更為 IndexLabel。
從 [工具箱] 的 [標準] 群組中,將 [HyperLink] 拖曳到頁面上。
HyperLink 控制項便會加入至設計介面中。
按一下頁面上的 [HyperLink],然後在 [屬性] 視窗的 [外觀] 分類中,將 [Text] 的值變更為 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] 連結。
ASPQuery.aspx 頁面隨即顯示,其中包含訊息 "Success. Dynamic querystring parameter found."
按一下 [上一步] 連結。
按一下 [Dynamic querystring generated by javascript] 連結。
JScriptQuery.aspx 頁面隨即顯示,其中包含訊息 "Success. Dynamic querystring parameter found.".
按一下 [上一步] 連結。
請將您的 Web 應用程式位址複製至 [剪貼簿] 或 [記事本] 檔案。 例如,位址可能看起來像這樣:
https://localhost:<PortNumber>/Querystring.aspx。
您稍後在此逐步解說中建立 Web 效能測試時,將會需要這個 URL。
建立測試專案
建立測試專案
在 [檔案] 功能表上,指向 [加入],然後按一下 [新增專案]。
[加入新的專案] 對話方塊隨即出現。
展開 [已安裝的範本] 底下的 [Visual C#],並選取 [測試]。
在範本清單中,選擇 [測試專案]。
在 [名稱] 方塊中,輸入 DynamicParameterSampleTest。
按一下 [確定]。
注意事項 根據預設,Visual Studio 2010 Ultimate 會加入單元測試檔案。 在本逐步解說中,您不需要單元測試檔案。 因此可以將檔案刪除。 即使您未刪除該檔案,它也不會影響逐步解說。
錄製 Web 效能測試並自動偵測 ASPQuery.aspx 頁面的動態參數
若要錄製 Web 效能測試
在 [測試] 功能表上按一下 [新增測試]。
[加入新測試] 對話方塊隨即出現。
在 [加入新測試] 對話方塊中,選取 [Web 效能測試],將測試命名為 DynamicParameterSampleApp.webtest,然後按一下 [確定]。
一個名為 DynamicParameterSampleApp.webtest 的新 Web 效能測試檔便會加入至您的專案中,而且 [Web 效能測試錄製器] 會在 Internet Explorer 的新執行個體中開啟。
警告
若要順利進行下個程序,您必須依照所列順序執行這些步驟。
在瀏覽器的網址列中,輸入或貼入您在手動測試 Web 應用程式程序步驟中複製的 Web 應用程式位址,然後按 ENTER。
注意事項 Visual Studio 2010 Ultimate 會在錄製時,開始在 [Web 效能測試錄製器] 中顯示 Web 效能測試 URL。
按一下 [Dynamic querystring generated by ASP.NET] 連結。
ASPQuery.aspx 頁面隨即顯示,其中包含訊息 "Success. Dynamic querystring parameter found."
按一下 [上一步] 連結。
按一下 [Dynamic querystring generated by javascript] 連結。
JScriptQuery.aspx 頁面隨即顯示,其中包含訊息 Success.Dynamic querystring parameter found。
按一下 [上一步] 連結。
若要停止錄製,按一下 [Web 效能測試錄製器] 上的 [停止]。
隨即出現對話方塊,顯示 [正在偵測動態參數] 的訊息。 它也會顯示進度列,以呈現收到的 HTTP 回應中參數偵測的進度。
接著 [將動態參數升至 Web 測試參數] 對話方塊隨即顯示。
因為會自動偵測在程序中於 ASPQuery 頁面的 CustomQueryString 中針對動態參數加入的自訂程式碼,所以該程式碼會在對話方塊中列出。
不會自動偵測 JScriptQuery 頁面中 CustomQueryString 的動態參數,因為自訂 Javascript 程式碼是在將程式碼加入至 Querystring.aspx 頁面程序中加入至 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___",而且會與從 var sessionId 傳回的值串連。
function jScriptQueryString() { var Hidden = document.getElementById("HiddenFieldSessionID"); var sessionId = Hidden.value; window.location = 'JScriptQuery.aspx?CustomQueryString=jScriptQueryString___' + sessionId; }
現在您知道發生錯誤的位置,也知道需要為 sessionId 擷取值。 不過,擷取值僅限文字,因此您需要嘗試尋找顯示 sessionId 實際值的字串,才能進一步找出錯誤。 查看程式碼,就可看見 var 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 要求底下的 QueryString 參數 CustomQueryString=jScriptQueryString___wy0zaykqadkoscuvoiqemofm 會反白顯示。
按一下 [取代]。
JScriptQuery.aspx 要求底下的 QueryString 參數會以新的內容參數更新:CustomQueryString=jScriptQueryString___{{Param0}}。
請注意要求樹狀結構中,相互關聯之偵測到的動態參數和未偵測到的動態參數之間相似的結構。