【IT168 专稿】
性能测试的目标是验证面向服务架构(SOA)的方案是否能够在一定负载条件下满足业务的性能要求。而压力测试的目标则是决定SOA可以在多大的负载下正常运行——正常运行的定义是能够满足一条或多条性能要求。
SOA应用案例
我们以前曾经谈过一个简单而粗糙(大型复杂服务)的SOA应用方案。这个SOA应用可以用来解决数位媒体的在线销售问题。服务层包括一个网络呈现层、客户账户服务、产品目录服务、购物车服务、数位订单完成服务、客户历史服务和一个接入标准金融服务数据库的记账服务。下面是这个SOA方案的图示。我们将以这个方案作为讨论SOA性能和压力测试的基础。
我们将使用一系列简单的、能代表日常生活的典型业务事件来进行这个SOA方案的性能与压力测试。在本文中主要涉及以下方面:
* 会员登录以及目录浏览
* 非会员登录以及目录浏览
* 会员登录以及目录购买
* 非会员登录以及目录购买
当然还有其它业务事件或者流程可以让这个应用更完整,不过作为本文的讨论材料来说以上这些已经足够。
测试计划的特殊性
性能或压力/负载测试需要团队对系统各方面有深入的了解,包括硬件、软件、固件、协议、事务以及业务。除非项目或系统需要长期持续进行容量测试,否则单独一个企业很难满足以上所有条件。测试主管必须与同事合作进行操作、开发、测试,并寻求第三方IT供应商的帮助,这样才能形成一个能够解决系统所有方面问题的团队。实际上,这与其它性能与压力测试没有什么不同,但是由于SOA应用的分散特性,制定一个有效的计划还是非常重要的。
由于SOA方案的复杂性与流动性,性能与压力测试团队需要使用发展性的方法进行测试,从单一流程扩展到多个流程,最终完成整体的日常应用性能/压力测试。与许多传统的应用不同,这必须是一个经常变化、支持重复性能测试的方案。因为在当前的SOA环境下可行的方案,到下一个迭代环境下可能就行不通了。切记,这是一个经常变化的方案(系列)。
从单线程到多线程
SOA应用所带来的难题之一就是方案的分离性。一种可以简化初始性能与压力测试的方案是单独处理每个业务事件或业务线程——即单线程方法。这并不是说,所有性能/压力测试都要使用这种方法,但是它的确可以在整个应用方案完成之前验证服务的稳定性与健全性,并且能极大地简化监控与调试工作。这与单元测试和集成测试简直是异曲同工的效果。
现在的问题就是不相关的业务事件之间的相互影响与依赖性。我们可以把这些单线程的场景视为整体性能/压力测试方案的组成零件,也就是把方案视为可以根据业务事件的组合情况迅速进行调整的模块化性能测试工具。
一旦性能/压力测试团队确定一系列相关的单独线程,并且根据需要对应用做出适当调整,就可以进行多线程的性能/压力测试了。多线程测试的前提是已经进行了一定程度的单线程测试,可以使用合适的监控和负载工具,并且确定了相关的业务线程。测试团队选择测试的是那些普遍存在于各种业务、但是执行松耦合关系任务的线程。
比如,客户记录服务负责跟踪的两个活动:目录浏览(非购买事件)和目录购买(购买事件)。团队现在可以确定松耦合活动对SOA应用的交叉影响并根据需要对应用进行任何调整。这里将过程中的每个场景视为可以根据业务事件的组合迅速调整且不断变化的工具箱中的单独组件。
在SOA环境下,可能很难确定性能故障发生的根源。实际上,如果没有早期的单线程与多线程性能测试,这几乎是不可能的。通过场景构建一个模块化工具,团队可以更快地根据SOA方案中快速变化的因素做出调整。而过去集中应用中所使用的“全功能”式的方案在迅速发展的SOA应用环境下则会很快地失去效用。
测试第三方服务
SOA应用领域另一个难解决的问题就是使用第三方服务的能力,这也同时使得SOA很容易受到第三方服务的影响。从性能与压力测试的角度来说,这可能是测试中最麻烦的一环。在这个24小时不停运作的世界里,有什么办法能测试一个只能访问其产品的服务吗?简单的回答是:不能。但是,企业可以通过几个步骤来减少或者隔离第三方服务的性能故障所带来的影响。
首先,不能使用任何第三方服务做任务关键服务。如果需要使用,则它必须提供包含详细性能/压力测试说明文档的服务等级协议(SLA)的支持。非关键的第三方服务应该以下面的方式提供访问:可以及时处理故障从而使其变成小故障,并且不会显著地影响用户体验。
其次,即使你不能自己测试第三方服务,还可以通过服务供应商的协作对其进行测试。如果供应商不想或者不能合作,那么你就要考虑是否应该更换一个供应商。
总结
不断发展的SOA应用让我们可以不断满足今天复杂的商业方案和竞争激烈的交付时间的需求,但它也为专业测试人员带来了新的难题。虽然没有任何一个方案可以解决全部问题,但是已有的实践可以为我们提供一些帮助。
过去那种直到最后才去考虑测试问题,然后随便让一个未经训练或没有经验的团队应付了事的做法已经行不通了。取而代之的,是有规律的、系统的、面向需求、能够使用工具进行灵活的和组件重用的测试方法。