BUAAZP.

HTTP压测工具stress发布

June 13, 2014

HTTP压测工具stress发布

@招牌疯子 zp@buaa.us

概述

stress是一个HTTP测试工具,采用Go语言编写,它是从vegeta项目改造而成的,但是由于和vegeta的理念不同,底层改动较大,而且以后会向不同的方向发展,所以我将其重新命名,作为新的开源软件进行维护。

Github地址:https://github.com/buaazp/stress

目标

stress的设计目标是支持HTTP协议的各种测试需求,尤其以压力测试、稳定性测试为主,同时可以输出美观的测试结果,便于后期统计和对比。
如果你用过ab,常常会苦恼于它只能对一个固定的请求进行压力测试,如果能有一个工具可以对一系列的请求进行测试,则更能反应出应用程序对外服务时所要面临的情况,那么stress就是你所要寻找的东西。

功能

stress拥有vegeta的全部功能,同时增加了一些用起来更加顺手的东西,下面将一一介绍。

stress attack -header="client:iPhone5S" -targets=down.txt -c=40 -n=100  

局部header只针对单条测试请求生效,设定方法是在METHOD之后直接写入KV对即可,示例:

GET client:iPhone5S resize-type:square http://127.0.0.1:8088/6xxkqpcm7j20b40e7myz.jpg  
GET http://127.0.0.1:4869/5f189d8ec57f5a5a0d3dcba47fa797e2 md5:5f189d8ec57f5a5a0d3dcba47fa797e3  

如果在MD5校验中失败,该请求的结果会被标记为一个特殊的结果码250,stress会认为结果码为250的case为MD5校验失败。

POST http://127.0.0.1:4869/ password.txt  

如果要以form表单形式上传文件,则在文件名之前加form关键字即可:

POST http://127.0.0.1:4869/ form:5f189.jpeg  

如果需要设定form表单中的文件名关键字(默认为filename,具体内容在RFC1867协议中),可以这样构造:

POST http://127.0.0.1:4869/ form:yourfilename:5f189.jpeg  
echo "GET http://127.0.0.1:8088/6xxkqpcm7j20b40e7myz.jpg" | stress attack  -c=30 -n=1000  

也可以将一系列的请求写在文件中,stress通过-targets参数打开目标文件进行测试。请求文件down2.txt示例:

GET HOST:ww4.sinaimg.cn resize-type:wap320  
http://127.0.0.1:8088/large/a13a0128jw1e6xxkqpcm7j20b40e7myz.jpg  
md5:ee08f10750475ad209a822ffe24f4e78  
POST http://127.0.0.1:4869/ form:filename:5f189.jpeg  
GET http://127.0.0.1:4869/5f189d8ec57f5a5a0d3dcba47fa797e2 md5:5f189d8ec57f5a5a0d3dcba47fa797e3  
...

请求文件没有大小限制,构造成百上千条请求进行测试毫无压力。然后在stress attack命令中指定该文件即可开始测试:

stress attack -targets=down2.txt -c=40 -n=10000  

target文件中的请求默认会以随机顺序进行测试,如有必要可以单独设定发送顺序为依次执行,加上-ordering="sequential"即可,示例:

stress attack -targets=down2.txt -c=40 -n=10000 -ordering="sequential"  
stress report -input=result.json,result2.json,result3.json -output=output.json -reporter=json  

-reporter支持三种格式的输出[text, json, plot],满足不同的需求。

stress -cpus=4 attack -targets=down2.txt -c=100 -n=10000  

展望

虽然现在的stress已经可以方便地使用,但是我心中还有一些对后续版本的期望。

总结

stress可以用来做并发压力测试(-c -n模式),也可以用来做长时间的稳定性、准确性测试(-rate -duration模式),测试请求构造简单,功能丰富,尤其是还支持批量测试和数据校验,测试结果美观易读,可以说是测试HTTP服务的一把利器。欢迎试用和反馈。

招牌疯子

Coder, OpenSource, DataStorageEngineer. Work@ByteDance
开源爱好者,zimg作者,大规模数据存储工程师。