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

相关文章
相关标签/搜索