總結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
在(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規則來提取結果中的數值。屬性配置以下:
注意,"Group Index」參數應該設置爲1
知平軟件致力於移動平臺自動化測試技術的研究,咱們但願經過向社區貢獻知識和開源項目,來促進行業和自身的發展。