性能测试/负载测试/压力测试差异
性能测试
性能测试的目的不是去找bugs,而是排除系统的瓶颈,以及为以后的回归测试建立一个基准。在理想的情况下,被测软件在这个时候已经是足够稳定了,所以这个过程得以顺利的进行。
一组清晰已定义好的预期值是让一次有意义的性能测试的基本要素。给一个web应用做性能测试,你要知道至少两样东西:在不同并发用户数或者Http连接数情况下的负载预期值*
性能测试可以通过负载试验,试验的结果显示出系统的性能。目的是确保让你的代码运行得尽可能高效,以及数据库在给定的操作系统和硬件配置的情况下最优化,达到预期值。
“运行负载试验->测度性能->调试系统”这个循环一直要被重复执行到被测试系统达到了期望的性能标准了才可以停。在这个时候,测试人员就可以明了在正常条件下的系统运转怎么样,同时这些就可以做为以后在回归测试中,评价新版本的软件性能的一个标准了。性能测试还有另一个目标就是建立一组被测系统的基准数据。
下面就是一些在应用程序代码之外仍可以提高WEB应用系统性能的例子:
*使用web缓存装制,如Squid提供的装置
*将高访问量的网页静态化,以避免这些高访问量对数据库进行大量的调用
*通过负载平衡的方法来水平缩放WEB服务器的结构*
*在水平缩放数据库群及将它们分为读写服务器和只读服务器后,还要对只读服务器群负载平衡。*
*通过增加更多的硬件资源(CPU,内存,磁盘等)纵向的缩放WEB及数据库服务器群
*增加网络的带宽
负载测试
负载测试通常都被定义为给被测系统加上它所能操作的最大任务数的过程。负载测试有时也会被称为“容量测试”,或者“耐久性测试/持久性测试”*
容量测试的例子:
*通过编辑一个巨大的文件来测试文字处理软件
*通过发送一个巨大的作业来测试打印机
*通过成千上万的用户邮箱来测试邮件服务器
*有一种比较特别的容量测试是叫作“零容量测试”,它是给系统加上空任务来测试的。
耐久性测试/持久性测试的的例子:
*在一个循环中不停的运行客户端超过一个扩展时间段*。
负载测试的目的:
*找到一些在测试流程中前面的阶段所进行的粗略测试中没有被找出的bugs,例如,内存管理bugs,内存泄露,缓冲器溢出等等。
*保证应用程序达到性能测试中确定的性能基线。这个可以在运行回归试验时,通过加载特定的最大限度的负载来实现。
尽管性能测试和负载测试似乎很像,但他们的目的还是有差异的。一方面,性能测试使用负载测试的技术,工具,以及用不同的负载程度来测度和基准化系统。在另一方面来讲,负载测试是在一些已经定义好的负载程度上进行测试的,通常对系统加上最大负载之后,系统应该仍然可以提供全部功能。
压力测试
压力测试是指通过对系统加载过度的资源,来使系统崩溃。进行这个疯狂行为的主要目的是为了保证系统出故障及可以适当的恢复,而这个恢复得怎么样的特性则是叫做可恢复性。
当性能测试需要的是一个可控制的环境和不断的测度的时候,压力测试则是令人欢喜的引起混乱及不可预测性。还是举WEB应用程序为例,下面是一些对系统可行的压力测试方法:
*两倍的已经基线的并发用户数或者HTTP连接数
*随机的关闭及重开连接到服务器上的网络上集线器/路由器的端口(例如,可以通过SNMP命令来实现)
*把数据库断线然后再重启
*当系统还在运行的时候,重建一个RAID阵列
*WEB和数据库服务器上运行消耗资源(如CPU,内存,磁盘,网络)的进程
压力测试并不是简单的为了一种破坏的快感而去破坏系统,实际上它是可以让测试工程师观察系统对出现故障时系统的反应。系统是不是保存了它出故障时的状态?是不是它就突然间崩溃掉了?它是否只是挂在那儿啥也不做了?它失效的时候是不是有一些反应*?在重启之后,它是否有能力可以恢复到前一个正常运行的状态?它是否会给用户显示出一些有用的错误信息,还是只是显示一些很难理解的十六进制代码?系统的安全性是否为因为一些不可预料的故障而会有所降低?这些问题可以一直问下去的。 #p#page_title#e#