随着网络技术的迅速发展,尤其是WEB及其应用程序的普及,各类基于WEB的应用程序以其方便、快速,易操作等特点不断成为软件开发的重点。与此同时,随着需求量与应用领域的不断扩大,对WEB应用软件的正确性、有效性和对WEB服务器等方面都提出了越来越高的性能要求,对WEB应用程序进行有效的系统的测试也逐渐成为人们研究的重要课题。

  目前可以见到各种WEB服务器平台,然而根据Mereury的研究报告,98%的WEB服务器都没能达到人们所期望的性能,平均只能发挥人们所期望性能的1/6左右。WEB性能测试能够确定影响WEB服务器性能的关键因素,从而可以有针对性地进行分析和改进,避免WEB服务器研究和优化过程中的盲目行为;同时,它也是选取不同的WEB服务器的重要参考。

  随着WEB应用程序使用越来越广泛,针对其性能测试的要求也越来越多,然而由于WEB程序综合了大量的新技术,诸如HTML、JAVA、Javascript、VBScript等,同时它还依赖很多其它的因素,比如Link、Database、Network等,使得WEB应用程序测试变得非常复杂。例如:WEB压力测试是评价一个WEB应用程序的主要手段,它的测试是一个代表性的方面。

  WEB应用程序的测试有别于传统软件的测试,它有其自身的特点。下面我们进行比较深入的讨论。

  一个Web站点为了个人消费者、商业客户、企业合作伙伴或者内部用户,都必须提供可靠、快速的性能,这是在评价一个Web应用是否满足用户需求和期望的关键指标。在这个竞争激烈的Internet 世界里,如果缺乏严格的过程,Web系统可能会在开发、发布和维护的过程中碰到一系列问题,甚至系统无法使用。而且如果一个企业的Web 应用没有良好的性能,意味着它会失去潜在的用户。所以,必须对Web 应用进行负载测试,了解它在不同的负载下的响应情况。但是,由于Web应用的复杂性和不可预测性,使得负载测试难度较大。如果负载测试不够准确,测试结果是没有任何用处的,甚至会产生误导,使企业高估或者低估Web 应用的能力[1]。因此,负载测试的设计是至关重要的,只有在设计的负载真正地模拟了现实用户的工作负载,并且模拟的用户行为真正模拟了现实用户的行为,负载测试的结果才是可靠的,从测试结果得出的结论也才会正确。

  2 负载测试

  负载测试在不同负载下测试客户端或者服务器端的响应时间。负载测试也可以用来帮助测试人员计算在给定时间内服务器可以处理的大数量的事务数。此外,当C/ S 系统使用了工作负载均衡或者分布式体系结构,负载测试应评估负载均衡或者分布式方法和设计是否一致[2]。

  负载产生器模拟浏览器的行为,不断地向Web 应用发送请求,然后在Web 应用发送一个应答之后,等待一段时间,接着发送新的请求。负载产生器可以模拟成千上万个并发用户来测试Web 应用的稳定性。在负载测试中,每一个模拟浏览器称为虚拟用户,一个虚拟用户是脚本的一个实例。

  对Web 应用进行准确的负载测试时,首先要准确、客观地了解Web 应用的负载情况。Web 应用的负载情况是设计负载测试的前提和基础。了解用户的各种行为和动作是负载测试设计的关键,一个设计良好的负载测试要尽可能准确地模拟用户的动作。Web 应用的日志文件和日志文件分析器是完成这个任务重要的资源。

  通过使用日志分析器对Web 应用日志文件的分析,鉴别和跟踪与Web 应用通信量( traffic) 有关的用户会话(user session) 变量集,其中主要包括的变量有:会话长度(以页面数度量) 、会话持续时间(以分钟和秒度量) 、会话期间访问的页面类型等等。页面请求分布是用户会话变量中需要特别关注的变量[4] 。这个变量显示了每个页面访问的频率,是设计测试场景的重要依据。除了这些主要变量外,那些会引起负载很小变化的其他变量也需要跟踪。在确定了需要跟踪的用户会话变量之后,用日志分析器得到这些变量值的范围和分布。

  估计Web 应用的负载水平,主要是Web 应用的通信量如何增长、Web 应用的高负载、Web 应用负载多长时间可以上升到高负载、高负载持续时间[4] 。一般情况下,高负载的水平和通信量的水平大致成正比。如果一个Web 应用每个星期的用户会话数为10 万个,在高峰期每小时的用户会话数为1500 个,那么可以预计如果每个星期的用户会话数为20 万个时,高峰期每小时的用户会话数也将翻倍,即为3000个。

  3 负载测试的设计

  准确掌握了Web 应用的负载情况之后,根据获得的各项信息进行负载测试设计,准确模拟用户的动作,其中主要包括用户导航建模和用户延迟建模。

  3.1 用户导航建模

  用户导航建模是对用户在Web 应用上的动作进行建模。现实中,用户在一个Web 应用的行为可能包括一系列的动作。例如,一个在线书店的用户登陆Web 应用之后,先浏览网页查看有关信息,然后再搜索要购买的书,后购买需要的书。从客户端的角度看,是一个用户执行了所有这些动作。但是,在负载测试中,不可能和现实完全一致地模拟所有用户的动作。负载测试的目的在于当用户给服务器施加不同水平的负载时,根据考察服务器端的各项度量指标找出系统的瓶颈,提高整个系统的性能。所以,负载测试时虚拟测试者只要模拟与实际负载相同的负载水平,而不用将虚拟测试者和实际用户一一对应,模拟每一个用户的具体动作。设计负载测试时可以把用户的一系列行为划分为若干子行为,然后虚拟测试者以适当的方式执行每一个子行为[5,6] 。例如,在上面的例子中,将用户行为可以划分为3个子行为??浏览信息、搜索图书、购买图书,然后用3 个不同的虚拟测试者以适当的次序执行3个子行为。从服务器端看来,这3个虚拟测试者给服务器施加的负载和实际使用中一个真实用户给服务器施加的负载是相同的。