WRK高级应用简介:
基于事件机制的高性能http压力测试工具,除了能针对单个url进行测试外,最重要的就是能够构造不同的url、不同的参数进行测试,发送携带body的POST请求。
wrk 公共lua API
- init = function(args)
- request = function()
- response = function(status, headers, body)
- done = function(summary,latency, requests)
- 全局变量wrk
wrk = { scheme = "http", host = "localhost", port = nil, method = "GET", path = "/", headers = {}, body = nil }
lua脚本
wrk功能高级的地方在于使用luajit进行自定义功能扩展,使用自定义函数构造不同的请求场景,常用的函数有:
- function setup(thread) 在创建线程时调用,wrk会为每一个测试线程调用一次setup方法,并传入代表测试线程的对象thread作为参数。setup方法中可操作该thread对象,获取信息、存储信息、甚至关闭该线程。
- function init(args) 在线程启动时调用一次
- function delay() 在每次发送request之前调用
- function request() 用来生成请求,每一次请求都会调用该方法,所以不要在这里写入耗时的操作,如果复杂的请求,在init函数就构造好,这里直接引用。
- function response(status, headers,body) 在每次收到一个响应时调用;为提升性能,如果没有定义该方法,那么wrk不会解析headers和body
- function done(summary, latency,requests) 该方法在整个测试过程中只会调用一次,可从参数给定的对象中,获取压测结果,生成定制化的测试报告。
自定义脚本中可访问的变量和方法:
变量wrk是一个table类型的全局变量,若修改改table,则会影响所有的请求。
wrk = {}
function wrk.format(method, path, headers, body)
wrk.format returns a HTTP request string containing the passed parameters merged with values from the wrk table.
– 根据参数和全局变量wrk,生成一个HTTP请求字符串。
function wrk.lookup(host, service)
wrk.lookup returns a table containing all known addresses for the host and service pair. This corresponds to the POSIX getaddrinfo()function.
– 给定host和service(port/well known service name),返回所有可用的服务器地址信息。
function wrk.connect(addr)
wrk.connect returns true if the address can be connected to, otherwise it returns false. The address must be one returned from wrk.lookup().
–测试与给定的服务器地址信息是否可以成功创建连接
高级使用场景
-
发送get请求
一般get请求url中参数固定的情况下,不需要修改脚本文件,如果需要构造特殊的请求则需要创建脚本文件,
场景一,参数格式如:/1?arg=1, /2?arg=2, /3?arg=3……
进入scripts目录下,新建http_get.lua文件,修改内容如下:
进入scripts目录下,新建http_get.lua文件,修改内容如下:counter = 0 num=0 request = function() path = "/" .. counter .."?arg=" ..num counter = counter + 1 num = num+1 return wrk.format("", path) end 执行脚本 wrk -t 2 -c50 -d 15s -R2000 --latency "http://IP:port/uri" --script=http_get.lua
场景二、参数嵌套,比如json格式的参数
{“query”: {“multi_match”: { “query”: “AABBCCDD”, “fields”: [ “address”, “address-aaa” ] }}}
进入到scripts目录下,新建一个lua文件,作为使用post方法的接口文件,将http 方法置为GET,修改内容如下:wrk.method = "GET" wrk.body='{"query": {"multi_match": { "query": "北京 AABBCCDDEEFFF", "fields": [ "address", "address-jdidx" ] }}}' wrk.headers["Content-Type"] ="application/json" 执行脚本 wrk -t 2 -c50 -d 15s -R2000 --latency "http://IP:port/uri" --script=get_matche.lua
-
使用POST 方法
进入到scripts目录下,新建一个lua文件,作为使用post方法的接口文件,修改内容如下:
wrk.method = "POST" wrk.body='{"KeyId":10}' wrk.headers["Content-Type"] ="application/json" 执行脚本 wrk -t 2 -c50 -d 15s -R2000 --latency "http://IP:port/uri?key=value" --script=post.lua
-
文件中指定uri
测试场景:http连接的url存在文件中,此种情况下,在init阶段将uri读取到wrk table中,requests只需引用即可,可提高性能。比如存在uri.txt /a.txt /b.txt /c.txt /d.txt
创建lua脚本文件,file_uri.lua
–uri.txt /a.txt /b.txt /c.txt /d.txturimap={} counter = 0 function init(args) for line in io.lines("uri.txt") do print(line) urimap[counter] = line counter=counter+1 end count =0 end request = function() counter = counter +1 path = urimap[counter % table.getn(urimap) +1] return wrk.format(nil, path) end 执行脚本 wrk -t 2 -c50 -d 15s -R2000 --latency "http://IP:port/uri" --script=file_uri.lua