HOW TO:建立錄製器外掛程式

WebTestRecorderPlugin 讓您修改錄製的 Web 效能測試。在您按一下 Web 效能測試錄製器工具列上的 [停止] 之後,而在 [Web 效能測試編輯器] 中儲存但呈現測試之前,會發生修改。

錄製器外掛程式協助解決的主要問題是執行您自己的自訂動態參數相互關聯。利用內建的相互關聯功能,Web 效能測試會在完成時偵測 Web 錄製中的動態參數,或者當您使用 [Web 效能測試編輯器] 工具列上的 [將動態參數升至 Web 測試參數] 時偵測動態參數。如需詳細資訊,請參閱HOW TO:解決動態參數所造成的 Web 效能測試播放問題。不過,內建偵測功能不一定會找到所有動態參數。例如,它找不到通常在 5 到 30 分鐘之內就會變更值的工作階段 ID。因此,您必須手動執行相互關聯程序。如需詳細資訊,請參閱HOW TO:將動態參數提升至 Web 效能測試參數

WebTestRecorderPlugin 讓您撰寫您自己的自訂外掛程式程式碼。這個外掛程式會在 [Web 效能測試編輯器] 儲存及呈現 Web 效能測試之前,以許多方式執行相互關聯或修改 Web 效能測試。因此,如果您判斷特定動態變數必須針對許多錄製進行相互關聯,可以自動化此程序。

錄製器外掛程式也有其他使用方式:加入擷取和驗證規則、加入內容參數,或將 Web 效能測試中的註解轉換為異動。

下列程序描述如何建立錄製器外掛程式的基本程式碼、部署外掛程式,以及執行外掛程式。程序後面的範例程式碼示範如何使用 Visual C# 建立自訂動態參數相互關聯錄製器外掛程式。

需求

  • Visual Studio Ultimate

建立錄製器外掛程式

若要建立錄製器外掛程式

  1. 開啟包含的Web效能的方案,並且負載有要為其建立錄製器外掛程式之Web 效能測試的測試專案。

  2. 在 [方案總管] 中,以滑鼠右鍵按一下方案、按一下 [加入],然後選取 [新增專案]。

    [加入新的專案] 對話方塊隨即出現。

  3. 在 [已安裝的範本] 底下,選取 [Visual C#]。

  4. 在範本清單中,選取 [類別庫]。

  5. 在 [名稱] 文字方塊中,輸入錄製器外掛程式的名稱。

    類別庫會加入至 [方案總管],而且新的類別會在 [程式碼編輯器] 中開啟。

  6. 在 [方案總管] 中,以滑鼠右鍵按一下新類別庫專案資料夾中的 [參考] 資料夾,然後選取 [加入參考]。

    提示提示

    新類別庫專案資料夾的範例是 RecorderPlugins

    接著會顯示 [加入參考] 對話方塊。

  7. 選取 [.NET] 索引標籤。

  8. 向下捲動,選取 Microsoft.VisualStudio.QualityTools.WebTestFramework,然後點選 [確定]。

    Microsoft.VisualStudio.QualityTools.WebTestFramework 就會加入至 [方案總管] 中的 [參考] 資料夾。

  9. 撰寫錄製器外掛程式的程式碼。首先,建立衍生自 WebTestRecorderPlugin 的新公用類別。

  10. 覆寫 PostWebTestRecording 方法。

    public class Class1 : WebTestRecorderPlugin
        {
            public override void PostWebTestRecording(object sender, PostWebTestRecordingEventArgs e)
            {
                base.PostWebTestRecording(sender, e);
            }
        }
    

    事件引數提供兩個可用的物件:錄製的結果和錄製的 Web 效能測試。這可讓您逐一查看結果尋找特定值,然後跳至 Web 效能測試中的相同要求進行修改。如果您要加入內容參數或參數化 URL 的組成部分,也可以只修改 Web 效能測試。

    注意事項注意事項

    如果修改 Web 效能測試,同時也需要將 RecordedWebTestModified 屬性設定為 true:e.RecordedWebTestModified = true;。

  11. 依據您要錄製器外掛程式在 Web 錄製發生之後執行的動作,加入其他程式碼。例如,您可以加入程式碼以處理自訂相互關聯,如下列範例所示。此外,也可以建立錄製器外掛程式,以用於將註解轉換為異動,或將驗證規則加入至 Web 效能測試等作業。

  12. 點選 [建置] 功能表上的 [建置 <類別庫專案名稱>]。

  13. 接下來,您必須部署錄製器外掛程式,以便於向 Visual Studio Ultimate 註冊。

Ff400224.collapse_all(zh-tw,VS.110).gif部署錄製器外掛程式

在編譯錄製器外掛程式之後,您需要在下列兩個位置之一放置產生的 DLL 檔案:

  • %ProgramFiles%\Microsoft Visual Studio 11.0\Common7\IDE\PrivateAssemblies\WebTestPlugins

  • %USERPROFILE%\My Documents\Visual Studio 2012\WebTestPlugins

注意事項警告

將錄製器外掛程式複製到這兩個位置之一後,您必須重新啟動 Visual Studio Ultimate,以便於註冊錄製器外掛程式。

Ff400224.collapse_all(zh-tw,VS.110).gif執行錄製器外掛程式

在建立新的 Web 效能測試時,您會看到 [啟用 WebTestRecordPlugins] 對話方塊。[啟用 WebTestRecordPlugins] 對話方塊會顯示所有可執行的外掛程式。

若要執行錄製器外掛程式

  1. 建立新的 Web 效能測試。如需詳細資訊,請參閱HOW TO:使用 Web 效能測試錄製器建立新的 Web 效能測試

    [啟用 WebTestRecordPlugins] 對話方塊隨即顯示。

  2. 選取錄製器外掛程式的核取方塊,然後按一下 [確定]。

    在 Web 效能測試完成錄製之後,就會執行新的錄製器外掛程式。

    注意事項警告

    當您執行使用外掛程式的 Web 效能測試或負載測試時,可能會收到類似下面的錯誤:

    Request failed: Exception in <plug-in> event: Could not load file or assembly '<"Plug-in name".dll file>, Version=<n.n.n.n>, Culture=neutral, PublicKeyToken=null' or one of its dependencies.The system cannot find the file specified.

    如果您對任何外掛程式進行程式碼變更並建立新的 DLL 版本 (Version=0.0.0.0),但是外掛程式仍然參考原始的外掛程式版本,就會導致此錯誤發生。若要更正此問題,請依照下列步驟執行:

    1. 在您的 Web 效能測試和負載測試專案中,您將會看到參考中的警告。移除並重新加入外掛程式 DLL 的參考。

    2. 從測試或適當的位置中移除外掛程式,然後再重新加入。

範例

這個範例示範如何建立自訂 Web 效能測試錄製器外掛程式,以執行自訂動態參數相互關聯。

注意事項注意事項

範例程式碼完整清單位在本主題底部。

檢閱範例程式碼

逐一查看結果,以尋找有 ReportSession 的第一頁

程式碼範例的這個部分會逐一查看每個錄製的物件並搜尋 ReportSession 的回應主體。

           foreach (WebTestResultUnit unit in e.RecordedWebTestResult.Children)
            {
                WebTestResultPage page = unit as WebTestResultPage; 
                if (page != null)
                {
                    if (!foundId)
                    {
                        int indexOfReportSession = page.RequestResult.Response.BodyString.IndexOf("ReportSession");
                        if (indexOfReportSession > -1)
                        {

加入擷取規則

現在已找到回應,您需要加入擷取規則。程式碼範例的這個部分會使用 ExtractionRuleReference 類別建立擷取規則,然後在 Web 效能測試中尋找要加入擷取規則的正確要求。每個結果物件中都會加入 DeclarativeWebTestItemId 新屬性,程式碼中使用這個屬性從 Web 效能測試取得正確要求。

           ExtractionRuleReference ruleReference = new ExtractionRuleReference();
           ruleReference.Type = typeof(ExtractText);
           ruleReference.ContextParameterName = "SessionId";
           ruleReference.Properties.Add(new PluginOrRuleProperty("EndsWith", "&ControlID="));
           ruleReference.Properties.Add(new PluginOrRuleProperty("HtmlDecode", "True"));
           ruleReference.Properties.Add(new PluginOrRuleProperty("IgnoreCase", "True"));
           ruleReference.Properties.Add(new PluginOrRuleProperty("Index", "0"));
           ruleReference.Properties.Add(new PluginOrRuleProperty("Required", "True"));
           ruleReference.Properties.Add(new PluginOrRuleProperty("StartsWith", "ReportSession="));
           ruleReference.Properties.Add(new PluginOrRuleProperty("UseRegularExpression", "False"));

           WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
           if (requestInWebTest != null)
           {
               requestInWebTest.ExtractionRuleReferences.Add(ruleReference);
               e.RecordedWebTestModified = true;
           }

取代查詢字串參數

現在程式碼尋找名稱為 ReportSession 的所有查詢字串參數,並將值變更為 {{SessionId}},如程式碼範例的這個部分所示:

           WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
           if (requestInWebTest != null)
           {
               foreach (QueryStringParameter param in requestInWebTest.QueryStringParameters)
               {
                    if (param.Name.Equals("ReportSession"))
                    {
                        param.Value = "{{SessionId}}";
                    }
                }
            }
using System.ComponentModel;
using Microsoft.VisualStudio.TestTools.WebTesting;
using Microsoft.VisualStudio.TestTools.WebTesting.Rules;

namespace RecorderPlugin
{
    [DisplayName("Correlate ReportSession")]
    [Description("Adds extraction rule for Report Session and binds this to querystring parameters that use ReportSession")]
    public class CorrelateSessionId : WebTestRecorderPlugin
    {
        public override void PostWebTestRecording(object sender, PostWebTestRecordingEventArgs e)
        {
            //first find the session id
            bool foundId = false;
            foreach (WebTestResultUnit unit in e.RecordedWebTestResult.Children)
            {
                WebTestResultPage page = unit as WebTestResultPage;
                if (page != null)
                {
                    if (!foundId)
                    {
                        int indexOfReportSession = page.RequestResult.Response.BodyString.IndexOf("ReportSession");
                        if (indexOfReportSession > -1)
                        {
                            //add an extraction rule to this request
                            // Get the corresponding request in the Declarative Web performance test
                            ExtractionRuleReference ruleReference = new ExtractionRuleReference();

                            ruleReference.Type = typeof(ExtractText);
                            ruleReference.ContextParameterName = "SessionId";
                            ruleReference.Properties.Add(new PluginOrRuleProperty("EndsWith", "&ControlID="));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("HtmlDecode", "True"));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("IgnoreCase", "True"));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("Index", "0"));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("Required", "True"));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("StartsWith", "ReportSession="));
                            ruleReference.Properties.Add(new PluginOrRuleProperty("UseRegularExpression", "False"));

                            WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
                            if (requestInWebTest != null)
                            {
                                requestInWebTest.ExtractionRuleReferences.Add(ruleReference);
                                e.RecordedWebTestModified = true;
                            }
                            foundId = true;

                        }
                    }
                    else
                    {
                        //now update query string parameters
                        WebTestRequest requestInWebTest = e.RecordedWebTest.GetItem(page.DeclarativeWebTestItemId) as WebTestRequest;
                        if (requestInWebTest != null)
                        {
                            foreach (QueryStringParameter param in requestInWebTest.QueryStringParameters)
                            {
                                if (param.Name.Equals("ReportSession"))
                                {
                                    param.Value = "{{SessionId}}";
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}

請參閱

工作

HOW TO:建立 Web 效能測試程式碼

HOW TO:使用 Web 效能測試編輯器編輯現有的 Web 效能測試

參考

WebTestRequestPlugin

PostWebTestRecording

ExtractionRuleReference

PostWebTestRecording

其他資源

建立和使用負載和 Web 效能測試的自訂外掛程式