问题描述

本文的标题看起来有些含糊其辞,这里我需要把问题阐述得更加清楚。这是我们使用VSTS进行Web Performance Test时,Asp.net造成的特定问题(也许其他开发工具或插件也会造成类似问题)。 我们知道Asp.net的控件名在前端是自动生成的,比如开发人员设计时,控件名为username; 在bowser端,会自动生成包含一大段前缀的HTML控件,例如ctl00$content$SiteThemeContentPage1$fragment_3526$ctl01$ctl00$LoginForm1$ctl07$username。具体的生成机制我没有研究,但是这个控件名的前缀确实是会随着比如父控件名,重新编译的变化而变化。

对于我们Web Performance Test来说,问题在哪里呢? 比如我们录制了一个Post Request,来模拟一个Form PostBack(见Asp.net的知识),如下图所示:

Post的参数名中包含了这些带着自动生成的前缀的控件名。以下两种情况对测试用例的维护非常糟糕:

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是一个非常好的实践,网上已经有相关的文章了,但是本文讲述的是另一个问题)

2,采用HtmlAgilityPack来支持XPATH语法。这是一个为HTML提供XPATH支持的开源库,在我用来还不错,这里下载。当然你可以使用其他的库。

3,我们可以定义这样的语法,如下图所示:

前缀"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

Web Performance Test : 为Request的Post参数名添加XPath支持的更多相关文章

  1. Web Performance Test: 如果使用Plugin过滤Dependent Request

    前言 由于Visual Studio的Web Performance Test是基于XML脚本的,留给用户修改测试行为的自由度并不高.因此,Plugin机制就对于实现很多客户化的配置显得很重要. 问题 ...

  2. Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群

    Redis总结(五)缓存雪崩和缓存穿透等问题   前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...

  3. request.getParameter(“参数名”) 中文乱码解决方法

    今天浏览项目时候,遇到一个问题,页面用${requestScope.参数名 }获取的值是乱码,然后搜了一下,最后说是编码的问题,附上查找的结果: 在Java 开发中,如果框架搭建的不完善或者初学者在学 ...

  4. Visual Studio的Web Performance Test提取规则详解(3)

    总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...

  5. Visual Studio的Web Performance Test提取规则详解(2)

    总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...

  6. Visual Studio的Web Performance Test提取规则详解(1)

    总结 Visual Studio的Web Performance Test是基于HTTP协议层的,它不依赖于浏览器,通过直接接收,发送HTTP包来和Web服务器交互.Web Performance T ...

  7. 13 Reasons Why You Should Pay Attention to Mobile Web Performance

    Mobile is no longer on the sidelines. If you’re not already thinking mobile first, you should at lea ...

  8. Java web课程学习之Request和Response

    request和response l HttpServletRequest l 请求转发 l HttpServletResponse l 请求重定向   请求流程 每次请求service(),都会由容 ...

  9. Web开发-Servlet&HTTP&Request

    <!doctype html>02 - JavaEE - Servlet&HTTP&Request figure:first-child { margin-top: -20 ...

随机推荐

  1. BitTorrent DHT 协议中文翻译

    前言 做了一个磁力链接和BT种子的搜索引擎 {Magnet & Torrent},因此把 DHT 协议重新看了一遍. BitTorrent 使用"分布式哈希表"(DHT)来 ...

  2. JSON语法五大要素图文介绍

    原文:http://www.jb51.net/article/32398.htm JSON语法是一种轻量级的数据交换格式.易于人阅读和编写.同时也易于机器解析和生成,下面就进行学习研究,希望本文能教会 ...

  3. QQ五笔词库转拼音词库小工具

    参考文章<用QQ拼音打五笔>中提供的信息而制作的小工具,功能是将QQ五笔导出词库文件转换为QQ拼音自定义短语使用的.ini格式文件,这样就可以使用QQ拼音进行五笔拼音混输了. 混输效果不错 ...

  4. django 1.7之后python manage.py syncdb没有了

    在命令行输入python manage.py createsuperuser按照提示输入即可记得先初始化表. django>1.7 python manage.py makemigrations ...

  5. 你知道吗?使用任何HTML5开发工具都可开发iOS、Android原生App

    APICloud App开发平台一直在不断升级开发工具库,这一年增加了众多开发工具.目的就是让开发者可以选择使用任何自己喜欢的HTML5开发工具去开发App.这次,APICloud把所有关于开发工具的 ...

  6. SpringMVC常用配置-添加静态资源处理器-针对SpringMVC中静态资源无法访问的问题

  7. 【转】Deadlock的一些总结(死锁分析及处理)

    1.1.1 摘要 在系统设计过程中,系统的稳定性.响应速度和读写速度至关重要,就像12306.cn那样,当然我们可以通过提高系统并发能力来提高系统性能总体性能,但在并发作用下也会出现一些问题,例如死锁 ...

  8. DataAnnotations里DisplayAttribute和 ValidationAttribute 如何从资源文件读取信息,显示多语言

    这个是我们常见的AccountModel代码 public class ChangePasswordModel { [Required] [DataType(DataType.Password)] [ ...

  9. python中的GIL(全局解释锁)多线程能够提升效率

    预启动的时候,应用程序仍然会调用 OnLaunched 方法的,在 OnLaunched 方法调用之后,会马上发生 Suspending 事件,随后应用就会暂停. 我先基于develop主分支拉出一个 ...

  10. 安装hadoop集群服务器(hadoop1.2.1)

    摘要:hadoop,一个分布式系统基础架构,可以充分利用集群的威力进行高速运算和存储.本文主要介绍hadoop的安装与集群服务器的配置. 准备文件: ▪ VMware11.0.0      ▪ Cen ...