zoukankan      html  css  js  c++  java
  • Web Performance Test : 为Request的Post参数名添加XPath支持

    问题描述

    本文的标题看起来有些含糊其辞,这里我需要把问题阐述得更加清楚。这是我们使用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的知识),如下图所示:

    image

    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,我们可以定义这样的语法,如下图所示:

    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

  • 相关阅读:
    docker笔记(1)
    解决MySQL8 #1227 – Access denied; you need (at least one of) the SYSTEM_USER privilege(s) for this ...
    nginx if判断&&和||写法
    泡泡后台Couchbase缓存使用经验分享
    ARTS-WEEK-007
    ARTS-WEEK-006
    ARTS-WEEK-005
    ARTS-WEEK-004
    ARTS-WEEK-003
    总结httpclient资源释放和连接复用
  • 原文地址:https://www.cnblogs.com/Binhua-Liu/p/3352815.html
Copyright © 2011-2022 走看看