若要檢視英文版的文章,請選取 [原文] 核取方塊。您也可以將滑鼠指標移到文字上,即可在快顯視窗顯示英文原文。
譯文
原文

如何:建立錄製器外掛程式

 

發佈時間: 2016年4月

WebTestRecorderPlugin 讓您修改錄製的 Web 效能測試。 修改會在您選擇 Web 效能測試錄製器工具列上的 [停止] 之後,並且在 [Web 效能測試編輯器] 中儲存及呈現測試之前發生。

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

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

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

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

需求

  • Visual Studio 企業版

若要建立錄製器外掛程式

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

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

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

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

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

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

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

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

    System_CAPS_tip提示

    新類別庫專案資料夾的範例是 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 效能測試。

    System_CAPS_note注意事項

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

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

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

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

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

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

  • %USERPROFILE%\My Documents\Visual Studio <版本>\WebTestPlugins

System_CAPS_caution警告

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

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

若要執行錄製器外掛程式

  1. 建立新的 Web 效能測試。 如需詳細資訊,請參閱Record and run a web performance test

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

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

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

    System_CAPS_warning警告

    當您執行使用外掛程式的 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 效能測試錄製器外掛程式,以執行自訂動態參數相互關聯。

System_CAPS_note注意事項

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

檢閱範例程式碼

程式碼範例的這個部分會逐一查看每個錄製的物件並搜尋 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}}";
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
顯示: