性能测试工具 wrk 使用教程( 三 )

  • init(args): 由测试线程调用,只会在进入运行阶段时,调用一次 。支持从启动 wrk 的命令中,获取命令行参数;
  • delay(): 在每次发送请求之前调用,如果需要定制延迟时间,可以在这个方法中设置;
  • request(): 用来生成请求, 每一次请求都会调用该方法,所以注意不要在该方法中做耗时的操作;
  • response(status, headers, body): 在每次收到一个响应时被调用,为提升性能,如果没有定义该方法,那么wrk不会解析 headers 和 body;
结束阶段:
function done(summary, latency, requests)done() 方法在整个测试过程中只会被调用一次,我们可以从给定的参数中,获取压测结果,生成定制化的测试报告 。
自定义 Lua 脚本中可访问的变量以及方法:
变量:wrk
wrk = {scheme= "http",host= "localhost",port= 8080,method= "GET",path= "/",headers = {},body= nil,thread= <userdata>,}以上定义了一个 table 类型的全局变量,修改该 wrk 变量,会影响所有请求 。
方法:
  1. wrk.fomat
  2. wrk.lookup
  3. wrk.connect
上面三个方法解释如下:
function wrk.format(method, path, headers, body)wrk.format returns a HTTP request string containing the passed parametersmerged with values from the wrk table.# 根据参数和全局变量 wrk,生成一个 HTTP rquest 字符串 。function wrk.lookup(host, service)wrk.lookup returns a table containing all known addresses for the hostand 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, otherwiseit returns false. The address must be one returned from wrk.lookup().# 测试给定的服务器地址信息是否可以成功创建连接4.4.1 通过 Lua 脚本压测示例调用 POST 接口:
wrk.method = "POST"wrk.body= "foo=bar&baz=quux"wrk.headers["Content-Type"] = "Application/x-www-form-urlencoded"注意: wrk 是个全局变量,这里对其做了修改,使得所有请求都使用 POST 的方式,并指定了 body 和 Content-Type头 。
自定义每次请求的参数:
request = function()uid = math.random(1, 10000000)path = "/test?uid=" .. uidreturn wrk.format(nil, path)end在 request 方法中,随机生成 1~10000000 之间的 uid,并动态生成请求 URL.
每次请求前,延迟 10ms:
function delay()return 10end请求的接口需要先进行认证,获取 token 后,才能发起请求,咋办?
token = nilpath= "/auth"request = function()return wrk.format("GET", path)endresponse = function(status, headers, body)if not token and status == 200 thentoken = headers["X-Token"]path= "/test"wrk.headers["X-Token"] = tokenendend上面的脚本表示,在 token 为空的情况下,先请求 /auth 接口来认证,获取 token, 拿到 token 以后,将 token 放置到请求头中,再请求真正需要压测的 /test 接口 。
压测支持 HTTP pipeline 的服务:
init = function(args)local r = {}r[1] = wrk.format(nil, "/?foo")r[2] = wrk.format(nil, "/?bar")r[3] = wrk.format(nil, "/?baz")req = table.concat(r)endrequest = function()return reqend通过在 init 方法中将三个 HTTP请求拼接在一起,实现每次发送三个请求,以使用 HTTP pipeline 。
五、总结本文中,我们学习了轻量级性能测试工具 wrk, 如何安装,以及具体的使用方法,包括通过 Lua 脚本来个性化定制请求等 。希望读完本文,能对您有所帮助哦!
六、参考文档:
  • https://github.com/wg/wrk
  • https://zjumty.iteye.com/blog/2221040
  • http://www.cnblogs.com/xinzhao/p/6233009.html

【性能测试工具 wrk 使用教程】


推荐阅读