在性能测试中如何处理Ajax技术
想像一下现在是1999年。开发人员和QA人员对将HTML浏览器做为计算客户端是很放心的。快速的网络线路部署好,大量的浏览器兼容性问题被清除,与C/S(Client/Server,客户机/服务器)时期相比,UI(User Interface,用户界面)的开发和调试变得很容易。终端用户已经习惯于点击链接并等待页面载入。
现在,让我们快进到2008年。动态HTML和Ajax(Asynchronous JavaScript and XML,异步JavaScript和XML)应用大量出现,Flash和Silverlight以浏览器插件方式递送RIA(Rich Internet Applications,富因特网应用程序),终端用户期望通过界面进行更便捷的互动,UI测试再次变得复杂起来。
虽然Ajax和RIA的出现并没有改变客户端性能这一基本问题,但是因为描述架构出现大量的、甚至是根本性的变化,所以对测试人员的技能水平提出比以往更高的要求。
Ajax为何对现有测试造成挑战
Ajax为什么会对现有的测试计划造成挑战,有多方面的原因。一方面,通过把更多工作转移到客户端,准HTML(pre-HTML)用户界面变得越来越相似,Ajax应用变得越来越复杂。因为Ajax以异步方式运行,所以测试程序没法设定状态,需要Ajax开发者从语法上分析服务端调用是如何影响性能及测试策略的。
另一方面,和任何语言一样,JavaScript作为大多数Ajax应用的基础,存在一些独有的测试问题。从某方面来说,JavaScript是一种啰嗦的脚本语言,调试起来非常困难。测试人员需要找出JavaScript引擎在什么地方出现问题,然后与开发者一起围绕该问题点进行设计和改进。Ajax应用倾向于调用JavaScript程序,并且程序的加载顺序需要测试人员事先明确指定。
再退回到C/S时代。当需要在多个浏览器上测试某个应用程序时,我们对原先的HTML页面重新请求一下即可。而今天,因不同的浏览器对Ajax的处理也不同,测试人员必须为此做更多的修改工作。
除了浏览器的不同以外,测试人员还必须对Ajax的不同风格进行测试。已经涌现出许多种Ajax框架,然而每一种框架各自对Ajax理念的理解都有不同的一面。因为浏览器在最初设计时并没有考虑到支持Ajax,所以不同的Ajax框架对浏览器的不足之处都有不同的权变方案。测试人员必须针对此权变方案做相应的调整,并且随着下一轮浏览器软件的升级,又可能要做新的变动。
Ajax框架还可能引起其他很多方面的变化。以JSON(JavaScript Serialized Object Notation,JavaScript对象符号)为例, 其通过把Ajax架构作为一种提升JavaScript对象特性并在Ajax中部分取代XML的方法,从中获益。另外,不同Ajax框架的编码请求方式也有所不同,所以当使用Ajax应用时,测试人员需要花更多时间来弄清楚相应请求报文的含义。
Ajax自身面临的挑战
马特·布雷伯格(Borland Silk Performer和Silk Test测试套件专家)提到,Ajax并不算新事物。“最新情况是它已经变得非常受欢迎,” 他说,“并且它改变了性能测试和功能测试。”
Ajax不存在一个确定的目标。“Ajax不是一种标准,它更大程度上是一种技术,而没有任何标准实施。”布雷伯格表示,并补充说他注意到JSON风格的Ajax正变得比XML风格更为普遍。
多样性更容易激发创新。既然Ajax框架起始于由五湖四海的成员组成的开源Web社区,维护Ajax应用可能就成为当前的唯一问题了。
“在Ajax之前,我们能忽视客户端的数据处理,而现在再也无法如此。”布雷伯格说。现在,测试人员必须考虑把多少工作量分配给客户端,多少工作量分配给服务器.
“Ajax有好有坏,” 布雷伯格继续说道。“它的目的是把一些处理工作从服务器转移到客户端。” 但是,他指出,运行在浏览器的JavaScript脚本使客户端更容易遭受安全攻击。
同时,匆忙奔向Ajax已经导致一些“设计说明不足”的应用软件开发。测试人员可能问一个非常好的问题“在开发之前,它被设计好了吗?”
在过去的几年里,我们已经看到应用向Ajax客户端的偏移,但开发经理同样有理由转移到RIA系统,它们有更严格的程序边界。RIA已经出,例如,Adobe Flash和微软Silverlight。
“我们注意到在安全性和一致性等方面Ajax正面临着许多挑战,”布雷伯格说。“在我看来,Ajax过后的下一波就是Flex(注:Flex 是Adobe公司提供的一种Presentation Server,展现服务,它是Java Web Container或者.Net Server的一个应用,根据.mxml文件,纯粹的XML描述文件和ActionScript,产生相应的.swf文件,传送到客户端,由客户端的Flash Player或Shockwave Player解释执行,给用户以丰富的客户体验。)。”
实际上,当最新的Borland Silk测试套件工具附件最终瞄准在更好的Ajax测试上时,第一个可用的RIA脚本性能测试工具就出现了。
Ajax测试面临的问题
Ajax模糊了Web界面和传统图形界面之间的分界,基斯杜化·莫里尔,WebPerformance(一家测试工具和服务提供厂商)的总工程师说道:“对各种测试来说,Ajax存在一项特别的挑战。我们已知的测试套件是把网站当作一连串的页面。如果你想抓取Ajax的所有内容,你将停止在一个页面上。你只能获取一个页面,而不是一系列页面。而JavaScript通过操作下层的对象模型,使得这个页面内容随着时间的变化而变化。”
“使用网站测试专用工具,你能享受到把一个页面部分地作为一个整体的优待。而Ajax剥夺了这些优待,”莫里尔说。“这要求测试工具能对页面有更深入的理解,而不只是简单的把一个请求发送给服务端,然后将其响应结果取回来。”现在,当一个工具模拟Ajax应用时,它必须按照正确地顺序得到全部页面元素,这些在以前可能是无关紧要的。
所有的问题总结来说,就是Ajax是一种更复杂的Web页面显示方式。“从测试和质量的立场来说,开发人员和测试人员面临的挑战之一就是应用变得越来越复杂,”莫里尔说。
“极端Ajax应用”正变得越来越像经典的富客户端应用程序(Rich Client Application)。例如,通过使用Ajax,应用程序的状态能从一个操作持续到下一个操作,这意味着对某一状态进行测试的话,需要考虑到所有从其它状态到达该状态的路径。换句话说,到达应用的某个状态存在多种可能。
Ajax性能测试的两个层次
在去年波士顿举行的Ajax Experience会议上,鲍勃·布芬建议,Ajax性能问题和已经在传统的面向对象开发中发现的问题有许多相似之处。为了避开陷阱,开发者必须返回到基础,明白你的代码是做什么的,是如何做的,这令人头疼。
“这是一种不同的环境,因为通过使用Ajax,各种应用在客户端都有其状态,因此捕获并重放测试脚本可能更加困难,”Web客户端开发工具公司Nexaweb的首席架构师布芬说:“测试人员必须改变他们使用测试工具的方式。更多的是回迁到C/S测试,而不是基于表或者基于页的测试。”
他推荐,在各种不错的工具中,能发现问题的是Yslow。这是雅虎开发的一个Firefox插件,它能在Ajax网页创建过程中对资源的请求使用及其它因素标出级别。
对所有Ajax应用性能来说,JavaScript性能都是内在的,并且它至少应该从两个角度来看,布芬说:“我把JavaScript性能描述为执行期间性能(runtime performance)和启动期间性能(startup-time performance)。当陷入到使用Ajax应用时,你必须处理这个问题。这意味着你将面临处理一堆JavaScript文件,这一堆文件的数量可能是20,甚至30。”
布芬提到的另一个JavaScript分析工具是jsLex,它能系统地注入分析代码。
上面介绍的Ajax多层复杂性也许可以让某些开发经理对一些Ajax开发计划重新进行考虑。“在JavaScript编程中有更多的抽象层,”布芬说,并举出JavaScript调用屏幕画图对象的例子进行描述。“我确实看见人们遇到限制,他们应该意识到:Ajax没办法满足他们所有的应用。”
从设计阶段开始考虑Ajax性能
“当设计一个Ajax应用时,你需要考虑期望用户去做什么操作。一个天才的应用——比如Google Maps(谷歌地图)——能预料到用户的下一个需求会是什么,并把这些需求呈现出来,”Gomez的技术副总裁布林说道。
在最开始的一到两年里,Ajax的一个消极影响是,当人们看到一个类似Google Maps的应用时,会说‘我也要做成那样。’但是,这并不容易做到。打造一个高品质、并且达到性能要求的Ajax应用,必须从设计阶段就开始考虑你的用户将会做什么。
Ajax的未来充满变数。在沉寂了一段时间之后,浏览器制造者可能已经准备好推出升级版本。布林说:“我们注意到几大主流浏览器都很快就会推出新版本,它们都受到人们现在遇到问题的影响和推动。”
他以即将到来的、微软公司的IE 8的种种变化为例,“一个根本性的改变就是用户的可用连接数。微软现在改为允许一个主机一次能发起6个连接,而在以前对每个浏览器,这个数字是2。
布林指出,Ajax框架的权变方案允许更多的连接。但是,这些权变方案可能造成严重破坏,因为一些网站管理员可能并不知道期望连接数出现增加。
在去年秋季举行的AEEC会议(Ajax Experience East Conference,Ajax Experience东部会议)上,会议内容包括提供网络化的Firebug和IBM Page Detailer,以及用于客户端分析的Firebug、Firebug Lite以及Dojo.Profile。
提高Ajax性能的建议
Ajax无疑是一个Web现象,同样的,Web也是Ajax最佳性能实践的展示平台。程序员和测试人员都能从同行的经验中获益。特别是Google和Yahoo,提供了不少构建Ajax应用方面的有用建议。这两个站点都有着丰富的Ajax使用经验。
在Ajax应用中,更大程度上的目标不是减低延迟,而是减低“用户可觉察的延迟”。 因此,Google开发者计划(Google Developer Program)的雅各布·穆恩(Jacob Moon)建议团队把精力集中在减少初始页面载入时HTTP请求的数量,以及把JavaScript和CSS文件整合到单一文件中以提升Ajax代码的性能。
Yahoo则为此提供了一系列规范来加快网站性能。同样的,把HTTP请求数量尽量减少仍是一个提升客户端用户可察觉速度的基本手段。Yahoo建议把终端用户80%的响应时间消耗在前端,主要是组件下载上。降低组件在页面渲染上的请求数量是创建更快速页面的关键。Yahoo组员们的另一个基本建议是:减少DNS查询,避免重定向,把JavaScript代码数量减至最少,并尽量减少重复脚本。