尽管笔者在知名外企已经从事软件测试工作七八年了,具体到性能测试也有几年经验了,期间在公司也做过几次Tech Talk;不过还真没有写过有关Performance Testing的博客, 正好借助这个平台也谈谈自己对Performance Testing的认识和经验。

曾经看到过文章,介绍对Performance Testing, Load Testing以及Stress Testing的区别,但还是不完全清楚界限。根据自己的经验理解,我认为Performance Testing是一个笼统的概念,是对系统总体性能评估的一个测试。它可以再具体细分为三类测试:

  1. 页面加载时间Page Load Time (PLT) Testing: 这种测试主要来衡量一个网站页面的加载时间,它包括前端呈现时间+后端服务器响应时间。这个时间如果过长,会影响用户体验并且会损失客流量。针对这种测试出现问题,需要对前后端都要做优化。具体前端优化,我们在前面已经写了一个博客,可以参考: 页面性能测试实战;对于后端服务器的优化,可以参考下面两类测试的经验。
  2. 负载测试Load Testing: 这个测试主要来衡量你们系统能支持多少并发数(同时在线人数)以及主要操作的响应时间,对整体性能的评估。对于高速发展的互联网,这类测试尤其重要:比如电商双十一大战,春运在线抢票12306平台;运营商对系统提出了越来越高的性能要求来满足商业需求。一般这个性能瓶颈发生在后台服务器端,要经常对后台进行监控和优化。
  3. 压力测试Stress Testing: 它测试的目的和Load Testing 是不同的;它主要集中在怎么使系统更稳定,更健壮。所以测试手段会有所不同,比如长时间跑大压力测试,看系统是不是崩溃,内存有没有泄露(Memory Leak);硬件资源是否够用等等。做这种测试首先要找出系统可能的不稳定因素(Breaking Point), 然后针对每个因素制定测试策略。

下面再具体说一下,笔者在实际工作中是怎么执行Load Testing 和 Stress Testing;(由于从事的项目都是基于.NET Framework的,下面提到的基本上用的是微软的工具)

1) Load Testing 的大体步骤: 
a. 首先了解本次Load Testing的目标,然后列出来需要测试那些页面或者用户操作(Action)。 
b. 针对每个Action,要用工具录制对应的脚本或者自己写脚本代码;对于.NET平台,我主要用Visual Studio 2012里面的Load Test工具。其它平台,可以参考Load Runner。 
c. 等每个Action的脚本代码都写好了,在Load Test里面加入这些Actions,然后设置测试的并发数和运行时间。 
d. 接下来就可以运行测试了,同时还要监控测试系统服务器里的主要的Performance Counters的数据。
e. 测试完毕后要对测试结果进行分析找出瓶颈(Bottleneck);是服务器硬件资源CPU/Memory/IO/Network的某个地方到达极限了还是代码逻辑有问题; 分析结果比执行测试更难更重要,这个是需要时间和经验的积累。 
f. 重复上面的测试在fix掉某些瓶颈之后;如果测试的结果比如:并发数和系统响应时间满足起初制定的目标;这个测试就可以宣告一段落了。

2) Stress Testing 的大体步骤: 
a. 首先也是了解本次Stress Testing的目标,然后列出来要尝试攻陷哪些可能的Breaking Points。
b. 对于要对系统长时间,大压力的测试,可以借助Load Testing的脚本修改运行时间和并发数达到对此测试的效果;测试过程中要监控系统的稳定性,有没有出现系统崩溃,重启,错误的日志等等。 
c. 对于Memory Leak的测试,需要利用长时间测试来观察内存的使用情况。 
d. 对于一些特殊场景,需要写专门的测试工具来配合;比如模拟内存不够,硬盘空间不够的情况。 
e. 另外可能还要测试备份系统是不是能自动接管工作在主系统瘫痪的情况下。 
f. 这种测试场景考虑的要相对周全一点,很多场景需要具体项目具体分析,在此不再一一列举。

这里主要谈论了自己对性能测试的理解,在以后的博客中还会讲讲具体怎么做性能测试的,会演示一些工具或者录制一些视频做进一步深入探讨:比如怎么用Visual Studio 来做Load Testing, 怎么检查Memory Leak, 监控系统稳定性等;在云计算时代,有机会也要研究一下基于云怎么做性能测试。