Visual Studio的Web Performance Test提取規則詳解(3)

總結html

Visual Studio的Web Performance Test是基於HTTP協議層的,它不依賴於瀏覽器,經過直接接收,發送HTTP包來和Web服務器交互。Web Performance Test發送和接收的一系列請求和響應之間存在相關性,例如,用戶登陸後,SID被傳遞給客戶端,下一次請求時,須要把SID發送到服務器。所以,Web Perfomance Test 定義了多種提取規則,幫助從服務器響應中提取信息,用於以後的請求。或者保存起來,做爲測試結果的一部分。web

 

 

Web Performance Test提供多種提取規則,如下表格來自MSDN正則表達式

提取規則的類型 說明
Selected Option 提取列表或組合框中的選定文本。
Tag Inner Text 從指定的 HTML 標記中提取內部文本。
Extract Attribute Value 從指定的 HTML 標記中提取特性的值。 有關如下內容的更多信息使用提取特性值規則的更多信息,請參見演練:向 Web 性能測試添加驗證規則和提取規則。
Extract Form Field 提取響應中指定窗體字段的值。
Extract HTTP Header 提取 HTTP 標頭的值。
Extract Regular Expression 從與正則表達式相匹配的響應中提取文本。
Extract Text 從響應中提取文本。
Extract Hidden Fields 從響應中提取全部的隱藏字段。

 

(1)(2)中,咱們講解了系統默認的一些提取規則,本文將講解如何創建自定義提取規則,本文的代碼能夠從這裏下載。express

 

繼承ExtractionRule瀏覽器

全部的提取規則,包括自定義規則都須要從ExtractionRule繼承,該類在Microsoft.VisualStudio.QualityTools.WebTestFramework.dll中實現。服務器

 

獨立的Libraryide

咱們最好把自定義規則都放到一個獨立的類庫中,這樣方便多個web performance test 工程引用。 web performance test 工程只要引用了該類庫,在右鍵點擊URL,選擇Add Extraction Rule中,在打開的Add Extraction Rule窗口中,就能夠看到全部的自定義提取規則,和用法系統默認的規則徹底相同。性能

 

例子測試

本文繼續沿用(2)中的例子,那是一個簡單的算術站點:ui

image

 

在(2)中,咱們發現Extract Regular Express規則不適合把「等於3。」中的數字提取出來,它提取的值將會包括整個文本。那麼,本文將定義一個「Custom Extract Regular Express」,實現經過正則表達式提取其中的數字,而不是整個文本。

 

看代碼:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using Microsoft.VisualStudio.TestTools.WebTesting;
using System.ComponentModel;
using System.Text.RegularExpressions;
using System.Web;

namespace CustomExtractionRule
{
    [DescriptionAttribute("Extracts the specificed group from mached regex")]
    [DisplayNameAttribute("Custom Extract Regular Expression")]
    public class CustomExtractRegularExpression : ExtractionRule
    {

        [DescriptionAttribute("Whether or not to perfom HTML decoding of extracted strings.")]
        [DisplayNameAttribute("Html Decode")]
        [DefaultValue(true)]
        public bool HtmlDecode { get; set; }

        [DefaultValue(false)]
        [DescriptionAttribute("Ignore case during search for matching text.")]
        [DisplayNameAttribute("Ignore Case")]
        public bool IgnoreCase { get; set; }

        [DefaultValue(0)]
        [DescriptionAttribute("Indicates which occurrence of the string to extract. this is a zero-based index.")]
        [DisplayNameAttribute("Index")]
        public int Index { get; set; }

        [DescriptionAttribute("Specify the regular expression to search for.")]
        [DisplayNameAttribute("Regular Expression")]
        public string RegularExpression { get; set; }

        [DefaultValue(true)]
        [DescriptionAttribute("If ture, the extraction  rule fails if no value is found to extract.")]
        [DisplayNameAttribute("Required")]
        public bool Required { get; set; }

        [DefaultValue(0)]
        [DescriptionAttribute("Indicates which group of the string to extract in matched regular expression. this is a zero-based index.")]
        [DisplayNameAttribute("Group Index")]
        public int GroupIndex { get; set; }

        public override void Extract(object sender, ExtractionEventArgs e)
        {
            String errormessage="";
            String result = this.Extract(e.Response.BodyString, ref errormessage);

            if (!string.IsNullOrEmpty(result))
            {
                if (this.HtmlDecode)
                {
                    result = HttpUtility.HtmlDecode(result);
                }
                e.WebTest.Context[this.ContextParameterName] = result;
            }
            else
            {
                e.Success = false;
                e.Message = errormessage;
            }
        }

        internal String Extract(string document,ref string errormessage)
        {
            int startat = 0;
            int num2 = 0;
            RegexOptions options = RegexOptions.Multiline;
            if (this.IgnoreCase)
            {
                options |= RegexOptions.IgnoreCase;
            }
            Regex regex = new Regex(this.RegularExpression, options);
            Match selectedMatch=null;
            while (startat < document.Length)
            {
                Match match = regex.Match(document, startat);
                if (!match.Success)
                {
                    break;
                }
                int num3 = match.Index + match.Length;
                if (num2 == this.Index)
                {
                    selectedMatch = match;
                }
                startat = num3;
                num2++;
            }
            if (selectedMatch == null)
            {
                errormessage = "Matched string is not found";
                return null;
            }

            if (selectedMatch.Groups.Count - 1 < this.GroupIndex)
            {
                errormessage = "Matched group is not found";
                return null;
            }

            return selectedMatch.Groups[GroupIndex].Value;
        }
    }
}

 

1) 在CustomExtractRegularExpression 的類和屬性上,咱們用到了DisplayNameAttribute,DescriptionAttribute,DefaultValue這些Attribute,他們的做用是在VS的Add Extraction Rule窗口上配置提取規則時,定義規則的顯示名和描述,以及每一個屬性的顯示名,描述和默認值。

2)提取規則經過重載void Extract(object sender, ExtractionEventArgs e) 方法來實現。若是提取成功,把e.Success 設置爲true,而且把提取的參數值保存在e.WebTest.Context[this.ContextParameterName]中;不然e.Success設置爲false,並在e.Message中填入失敗的消息。

3)Custom Extract Regular Expression規則,相對於Extract Regular Expression規則,咱們增長了一個Group Index參數,容許用戶從特定的正則表達式匹配中,選中匹配的group,關於正則表達式group,能夠參考MSDN

 

應用自定義規則

如今,咱們把規則添加到web performance test中,咱們用Custom Extract Regular Expression來替換在(2)中咱們使用的Extract Text規則來提取結果中的數值。屬性配置以下:

image

 

注意,"Group Index」參數應該設置爲1

 

本文由知平軟件劉斌華原創,轉載請註明出處。

知平軟件致力於移動平臺自動化測試技術的研究,咱們但願經過向社區貢獻知識和開源項目,來促進行業和自身的發展。

相關文章
相關標籤/搜索