轻量级性能测试工具wrk - 使用(实战篇)

拜拜、爱过 提交于 2020-03-02 18:43:45

 

一、发送POST请求例子

wrk压力测试POST请求--以本地项目地址为例:http://192.168.180.126

登录接口:/api/user/login/

请求数据:

{
    "username":"admin",
    "password":"admin123456",
    "code":666
}

1.编写lua脚本,填写post的数据,如login.lua

wrk.method = "POST"
wrk.body = '{"username":"admin","password":"admin123456","code":666}'
wrk.headers["Content-Type"] = "application/json"

function request()
   return wrk.format("POST",nil,nil,body)
end

function response(status, headers, body)
   if status ~= 200 then
      print(body)
      wrk.thread:stop()
   end
end

2.执行wrk,开始压力测试。

wrk -t 16 -c 100 -d 30s --latency --timeout 5s -s login.lua http://192.168.180.126/api/user/login/

压测结果如下:

二、发送带随机参数的get请求例子

wrk压力测试带随机参数的get请求--以本地项目地址为例: http://192.168.160.30:8080

get接口:/academy/train/course/?id=

1.构造不同的get请求,请求带随机参数,则lua脚本如下:

request = function()
num = math.random(1,10)
        path = "/academy/train/course/?id="..num
        return wrk.format("GET",path)
end

2.执行wrk,开始压力测试。

wrk -t 16 -c 100 -d 30s --latency --timeout 5s -s test.lua http://192.168.160.30:8080

压测结果如下:

三、添加参数txt文件的get请求例子

wrk压力测试添加参数txt文件的get请求--以本地项目地址为例: http://192.168.160.30:8080

get接口:/academy/train/course/?id=

id.txt文件内容如下:

1
2
3
4
5

1.添加参数txt文件的get请求,则lua脚本如下:

idmap = {}
counter = 0
function init(args)
        for line in io.lines("id.txt") do
                print(line)
                idmap[counter] = line
                counter = counter + 1
        end
        counter = 0
end

request = fuction()
        local path = "/academy/train/course/?id="
        parms = idmap[counter%(table.getn(idmap)+1)]
        path = string.format(path,parms)
        counter = counter + 1
        return wrk.format(nil,path)
end

2.执行wrk,开始压力测试。

wrk -t 16 -c 100 -d 30s --latency --timeout 5s -s id.lua http://192.168.160.30:8080

压测结果如下:

四、添加参数txt文件的post请求例子

wrk压力测试添加参数txt文件的post请求--以本地项目地址为例:http://192.168.180.126

登录接口:/api/user/login/

login.txt文件内容如下:

admin

1.添加参数txt文件的post请求,则lua脚本如下:

loginmap = {}
counter = 0
function init(args)
        for line in io.lines("login.txt") do
                loginmap[counter] = line
                counter = counter + 1
        end
        counter = 0
end

request = function()
        local body1 = '{"username":"'
        local body2 = '","password":"admin123456","code":666}'
        parms = loginmap[counter%(table.getn(loginmap)+1)]
        path = "/api/user/login/"
        method = "POST"
        wrk.headers["Content-Type"] = "application/json"
        body = body1..parms..body2
        return wrk.format(method,path,wrk.headers,body)
end

2.执行wrk,开始压力测试。

wrk -t 16 -c 100 -d 30s --latency --timeout 5s -s login_txt.lua http://192.168.180.126

压测结果如下:

若参数txt中有转义字符,可用如下方法处理:

parms = string.gsub(urimap[counter%(table.getn(urimap) + 1)],'\r','')

如果要打印返回数据,可添加如下脚本:

a=1
function response(status, headers, body)
   if(a==1)
   then
           a=2
          print(body)
      end
end

五、提交不同表单内容例子

wrk压力测试添加参数txt文件的post请求--以本地项目地址为例:http://192.168.180.126

登录接口:/api/user/login/

1.提交不同表单内容的post请求,则lua脚本如下:

wrk.method = "POST"
wrk.body = ""
wrk.headers["Content-Type"] = "application/x-www-form-urlencoded"
wrk.path = "/api/user/login/"

-- 提交不同表单内容
local queries = {
        "username=admin&password=admin123456&code=666",
        "username=ZY&password=666666aa&code=666"
}

local i = 0
request = function()
        local body = wrk.format(method,path,headers,queries[i % #queries+1])
        i = i + 1
        return body
end

2.执行wrk,开始压力测试。

wrk -t 16 -c 100 -d 30s --latency --timeout 5s -s queries.lua http://192.168.180.126

压测结果如下:

六、访问多个url例子

1.需要创建一个文件名为paths.txt,里面每行是一个要测试的url网址,paths.txt如下:

 https://www.baidu.com
 https://www.csdn.net

2.lua脚本如下:

#!/usr/bin/lua
counter = 0

-- Initialize the pseudo random number generator - http://lua-users.org/wiki/MathLibraryTutorial
math.randomseed(os.time())
math.random(); math.random(); math.random()

function file_exists(file)
  local f = io.open(file, "rb")
  if f then f:close() end
  return f ~= nil
end

function shuffle(paths)
  local j, k
  local n = #paths
  for i = 1, n do
    j, k = math.random(n), math.random(n)
    paths[j], paths[k] = paths[k], paths[j]
  end
  return paths
end

function non_empty_lines_from(file)
  if not file_exists(file) then return {} end
  lines = {}
  for line in io.lines(file) do
    if not (line == '') then
      lines[#lines + 1] = line
    end
  end
  return shuffle(lines)
end

paths = non_empty_lines_from("paths.txt")

if #paths <= 0 then
  print("multiplepaths: No paths found. You have to create a file paths.txt with one path per line")
  os.exit()
end

print("multiplepaths: Found " .. #paths .. " paths")

request = function()
    path = paths[counter]
    counter = counter + 1
    if counter > #paths then
      counter = 0
    end
    return wrk.format(nil, path)
end

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!