Web Performance Test : 爲Request的Post參數名添加XPath支持

問題描述css

本文的標題看起來有些含糊其辭,這裏我須要把問題闡述得更加清楚。這是咱們使用VSTS進行Web Performance Test時,Asp.net形成的特定問題(也許其餘開發工具或插件也會形成相似問題)。 咱們知道Asp.net的控件名在前端是自動生成的,好比開發人員設計時,控件名爲username; 在bowser端,會自動生成包含一大段前綴的HTML控件,例如ctl00$content$SiteThemeContentPage1$fragment_3526$ctl01$ctl00$LoginForm1$ctl07$username。具體的生成機制我沒有研究,可是這個控件名的前綴確實是會隨着好比父控件名,從新編譯的變化而變化。html

對於咱們Web Performance Test來講,問題在哪裏呢? 好比咱們錄製了一個Post Request,來模擬一個Form PostBack(見Asp.net的知識),以下圖所示:前端

image

Post的參數名中包含了這些帶着自動生成的前綴的控件名。如下兩種狀況對測試用例的維護很是糟糕:app

1,隨着編譯生成的前綴的變化,每隔一段時間,咱們就須要更新Post Request中的參數名,來避免測試失敗,若是你有大量的測試用例,或者用例中有大量PostBack的控件(Asp.net中這很常見),這個工做讓人發狂。函數

2,項目可能部署了好幾個測試版本須要進行load test,那麼你就要維護好幾個版本的測試用例,再考慮到第一條,這簡直不是人乾的了。工具

 

解決方案開發工具

若是是進行Web的UI測試,顯然咱們已經不少種辦法來應付這種狀況(雖然Web UI測試本質上和Web Performance測試是不一樣的,Web Performance測試是直接運行在HTTP層的,可是仍是有不少東西能夠借鑑);好比Selenium2 咱們能夠用XPath,css selector來定位控件,TestComplete可使用Name Mapping;正如咱們標題所說的,咱們將用XPath的方式,好比上文中的username控件,咱們用這樣的語法來匹配控件名 -- "//text[contains(@name,'username')]"。 可是Web Performance Test原生不支持XPath,而這就是咱們要作的。具體應該怎麼作呢? 這裏我不打算直接貼出代碼了,而是給出主要的步驟:測試

1,咱們應該添加一個WebTestPlugin。爲何不是Custom Extraction Rule呢?由於咱們這裏須要抽取的並非Post參數的值,而是Post參數名,考慮一下其中的區別。(是的,寫一個Custom Extraction Rule,經過Xpath來抽取Content Parameter是一個很是好的實踐,網上已經有相關的文章了,可是本文講述的是另外一個問題).net

2,採用HtmlAgilityPack來支持XPATH語法。這是一個爲HTML提供XPATH支持的開源庫,在我用來還不錯,這裏下載。固然你可使用其餘的庫。插件

3,咱們能夠定義這樣的語法,以下圖所示:

image

前綴"XPath:",後面接XPath的匹配字符串。從此咱們也能夠添加更多的前綴支持,如"CssSelector:",而後根據不一樣的前綴,路由到不一樣的處理函數中

4,寫一個自定義的WebTestPlugin。很明顯,咱們須要重寫PreRequest函數,它須要作的是:

    1) 遍歷e.Request.Body中FormPostParameters,也就是全部的Post參數。找到參數名包含前綴XPATH:的參數,把xpath匹配符從參數名中提取出來。

    2) 經過e.WebTest.LastResponse.BodyString,獲取HTML文本。建立HtmlAgilityPack的HtmlDocument對象。用步驟1種獲得的xpath進行查詢,找到控件。

    3) 用步驟2中獲得的真實的控件名,也就是ctl00$content$SiteThemeContentPage1$fragment_3526$ctl01$ctl00$LoginForm1$ctl07$username。來替換FormPostParameter對象中原來的的控件名,也就是匹配符XPath://input[contains(@name,’username’)],大功告成

 

Binhua Liu原創,2013/10/5

相關文章
相關標籤/搜索