先说下模拟真实用户操作。如果熟悉浏览器的工作原理,会知道浏览器在加载网页的时候,是同时并发多个TCP连接去请求页面对应的HTTP资源,包括HTML、JS、图片、CSS,当前流行的浏览器普遍会并发6-10个连接。然而,性能测试工具在模拟单个用户操作的时候,基本上都是单连接串行加载页面资源。产生的差异在于,假如页面有100个资源,每个HTTP请求的响应时间约为100毫秒,那么浏览器采用6个连接并行加载网页时大概会需要1.7秒(100/6*100毫秒),而测试工具采用单连接串行加载需要10秒(100*100毫秒),两者结果相差十分巨大。这也解释了为什么有时候我们通过性能测试工具测试得到的响应时间挺长,但是手动用浏览器加载网页时感觉挺快的原因。
  再说下有效并发。什么叫有效并发?有效并发是我们在测试工具中设置了1000虚拟用户数,实际在服务器端能产生1000并发压力。然而现实情况是,很多时候由于测试设备自身出现了性能瓶颈,压力发生器产生的并发压力远小于设定值,并且通常测试工具也不会将该问题暴露给测试人员;如果测试人员忽略了这个问题,以为测试得到的结果是在设定并发压力下的结果,那么终分析得出的结论也跟实际情况大相径庭了。不过,我们可以通过保障测试环境不存在瓶颈,使得实际生成的并发压力尽可能地与设定值一致;另一方面,我们也可以通过在测试过程中监控Web层(例如Nginx)的连接数和请求数,查看实际达到服务器端的并发数是否跟我们的设定值一致,以此来反推压力发生器的压力是否有效。
  了解这些缺陷的意义在于,我们可以更清楚测试工具的原理,从而更准确地理解测试结果的真实含义。
  性能测试工具推荐
  经过充分的理论铺垫,现在总算可以进入正题,开始讲解工具部分了。
  在性能测试工具方面,我重点向大家推荐Locust这款开源工具。目前阶段,该款工具在国内的知名度还很低,大多数测试人员可能之前都没有接触过。为了便于理解,我先将Locust与LoadRunner、Jmeter这类大众耳熟能详的性能测试工具进行简单对比。

  通过对比,大家可能会疑惑,Locust也不怎么样嘛,资源监控也不支持,报告分析能力也这么弱,那为啥还要选择它呢?
  授权方式这个不说了。虽然LoadRunner是商业软件,价格极其昂贵,但是国内盗版横行,别说个人,算是大型互联网公司,用正版的也没几个。
  从功能特性的角度来讲,LoadRunner是全面的,用户群体也是多的,相应的学习资料也为丰富。个人建议如果是新接触性能测试,可以先熟悉LoadRunner,借此了解性能测试工具各个模块的概念和功能,在此基础上再转到别的测试工具,也都比较好上手了。不过,LoadRunner只能在Windows平台使用,并且并发效率比较低,单台压力机难以产生较高的并发能力,这也是现在我弃用该款工具的主要原因。
  同样地,Jmeter的并发机制也是基于线程,并发效率存在同样的问题;另外,Jmeter在脚本编写和描述方面是基于GUI操作,个人感觉操作比较繁琐(这个因人而异),因此不是很喜欢。
  那么,我重点推荐的Locust有啥特别的地方呢?
  如果从整体功能上来看的话,Locust的功能的确比较单薄。不过,作为性能测试工具核心的压力发生器部分,却是非常不错的。抛开官方文档的介绍,个人觉得赞的有两点。
  首先是模拟用户操作,也是测试脚本描述方面。Locust采用Pure Python脚本描述,并且HTTP请求完全基于Requests库。用过Requests的都知道,这个库非常简洁易用,但功能十分强大,很多其它编程语言的HTTP库都借鉴了它的思想和模式,如果将其评选为好用的HTTP库之一(不限语言),应该也不会有太大的争议。除了HTTP(S)协议,Locust也可以测试其它任意协议的系统,只需要采用Python调用对应的库进行请求描述即可。
  另外一点是并发机制了。Locust的并发机制摒弃了进程和线程,采用协程(gevent)的机制。采用多线程来模拟多用户时,线程数会随着并发数的增加而增加,而线程之间的切换是需要占用资源的,IO的阻塞和线程的sleep会不可避免的导致并发效率下降;正因如此,LoadRunner和Jmeter这类采用进程和线程的测试工具,都很难在单机上模拟出较高的并发压力。而协程和线程的区别在于,协程避免了系统级资源调度,由此大幅提高了性能。正常情况下,单台普通配置的测试机可以生产数千并发压力,这是LoadRunner和Jmeter都无法实现的。
  有了一个不错的引擎,外表装饰简陋点也都是可以接受的了。不过虽然Locust功能单薄,特别是在性能指标监控和测试报告图表方面比较缺失,但是Locust的代码结构清晰,核心代码量也只有几百行,可扩展性也非常不错。换言之,Locust的可玩性(hackable)极强,对于一个想深入挖掘性能测试工具原理的人来说,Locust非常适合。
  好了,Locust的介绍暂且到这儿,后续我会再对Locust的使用方法和二次开发进行详细介绍,也算是弥补官方文档的不足吧。