说起压力测试、性能测试工具,名气比较大的当属 LoadRunner 和 JMeter。但是他们对于某些场景下的 API 并发测试而言,都太重了。我这里强调的并发测试,是侧重功能性的校验,而不是收集服务器,数据库这些后台的性能指标。什么叫“功能性的校验”呢?比如说,我们要针对一笔订单接口并发退款,或者用同一个订单号并发创建订单,目的是为了保证后台逻辑无误。
对于这类 API 并发的功能测试,我之前一直是自己写脚本建线程去实现。后来发现项目中大量的接口都需要做这种测试,而且也有不少现成工具可以用,就懒得写了。
-
Apache Bench
熟悉 Linux 和 Mac 的人都知道 ab ,因为系统里自带了这个利器。用一行命令就可以做并发测试。
ab -n 100 -c 10 -l http://www.your_site.com
-n number 总的请求数
-c concurrency 并发数
-l 表示当某个请求的回复长度不与第一个请求的回复长度一致时,不把它作为失败的请求
ab 使用很方便,可是问题在于,当我们需要在一个test中对多个 URL 进行并发请求的时候,ab没法做到。这时,我们可以用 siege。
-
siege
siege 安装方式有两种,可以用 homebrew:
brew install siege
还可以直接下载压缩包
curl -C - -O http://download.joedog.org/siege/siege-latest.tar.gz
tar -xvf siege-latest.tar.gz
cd siege-4.0.2
./configure
make
make install
常见参数
-t time 测试时间,比如 60s 或 5M
-c concurrency 并发数
-r repetitions 重复做几轮
-f text file 从外部文件读取参数值
-d delay 延迟时间默认是1秒; 如果设置为 -d 5 表示是在1-5秒之间的随机延迟时间
多个请求
在 siege-urls.txt 文件中定义两个不同的并发请求 Get 和 Post。order.json 中是 json格式的消息体。
https://api.appletest.com/v1/apps/app_f1KG/orders/12345
https://api.appletest.com/v1/apps/app_f1KG/orders/12345 POST <./order.json
执行命令
siege --header="Authorization:Bearer your_username" -f siege-urls.txt
单个请求自然更简单:
POST:
siege -t3s -c20 -d5 --header="Authorization:Bearer your_username" 'https://api.appletest.com/v1/apps/app_f1KG/orders/12345 POST <./order.json'
GET:
siege -t60s -c20 -d10 --header="Authorization:Bearer your_username" https://api.appletest.com/v1/apps/app_f1KG/orders/12345
最后再多说几句,如果要实现 URL 之间的交互,比如维护不同并发用户的 Cookies,那还是用 JMeter吧。GUI界面丑归丑,好歹是个老牌工具,又可以录制,又有详细报告,没什么代码背景的测试人员也可以学起来。