5.1 Ajax
这里提到的"Ajax(Asynchronous Java and XML)"可不是古代希腊的英雄[1],而是一种更好地为底层应用服务的最终用户技术。这里的关键词是“异步(Asynchronous)”,是指打破传统模式的同步方式(当一端发送完一个消息后,然后等待另一端回应,在等待的同时,它不能进行其他操作)。Ajax技术应用到您的应用程序设计中,便可消除这种现象,从而可能导致应用程序优秀的最终用户体验。不幸的是,许多自动化性能测试工具很难处理Ajax这样的技术。
问题的关键在于,自动化测试工具在默认情况下是以同步的方式工作。传统的应用程序的工作方式是客户端发出请求,然后等待服务器响应。而应用Ajax技术的应用程序的工作方式是客户端发出请求,服务器收到请求后进行响应(因此客户端可以继续做其他事情),然后经过一些随机时间后,再响应最开始的请求。您是如何看待此问题?对于请求和响应上的匹配这将是一项新的挑战。
从编程的角度来看,高性能工具必须创建一个线程来等待正确的响应,而其余的脚本继续执行。有经验的编程人员可以用代码解决此问题,但它可能需要对测试脚本进行大量的修改(很可能是加班加点的改脚本),事实上并非所有测试工程师都具有像开发人员那样反复修改测试脚本的能力,因此,需要更好的自动化性能测试工具来处理这些问题。有一个好消息是测试工具商已经开始提供对Ajax这项技术处理功能。
如果您的应用程序设计过程中使用了Ajax技术,检测任何一款性能测试工具,评估它是否可以支持这项技术。
“推”与“拉”
在Ajax技术中尽管我们论及请求和响应的问题,让我们再讨论这样的案例“从服务器端给客户端创建一个请求(Push)而不是从客户端开始一个请求(Pull)”。最近我看到关于这方面的一个例子,在一个呼叫中心应用程序最优路径选择过程中。用户登录目的是告诉他们准备接收呼叫,然后等待呼叫到达。这种情况也叫做“部署”和“预定”。那么,对于这种情况,如何使用传统的自动性能测试工具去准备脚本呢?你可以录制用户登录和准备接听电话的操作,但是在呼叫到达之前,他们只是等待而已。这将需要一些手工的干预,在脚本中创建一个循环等待接入呼叫的过程。
有时push和pull请求在同一个脚本中。如果你的性能测试工具不能很好地处理这种情况,那么你必须确定是否"push"的内容是很重要的性能测试点。是服务器初始化的请求可以被忽略,还是这些处理事务流的关键部分可以被忽略?你可能忽略服务“推送”内容的一个例子是股票市场上的行情显示系统,它一直在给客户端返回信息,但却没有体现在任何脚本中所定义的任何事务中。
[1]埃阿斯(Ajax):希腊勇士,忒拉蒙(telamon)之子,奋力夺回阿喀琉斯(Achilles)遗体,但在决定奖赏时众人选择了奥德修斯(Odysseus),于是在雅典娜(Athena)女神的策动下他指挥攻击了奥德修斯所在的希腊军队,当他觉悟后自杀。