wrk 执行 Lua 脚本

我的问题是,当我运行

wrk -d10s -t20 -c20 -s /mnt/c/xxxx/post.lua http://localhost:xxxx/post

Lua 脚本只执行一次吗?它只会将一个项目放入到数据库中的 URL。

-- 这是个使用 HTTP POST 方法的示例脚本,它演示如何设置HTTP方法、请求体,以及如何添加头部信息
math.randomseed(os.time())
number =  math.random()
wrk.method = "POST"
wrk.headers["Content-Type"] = "application/json"
wrk.body = '{"name": "' .. tostring(number) .. '", "title":"test","enabled":true,"defaultValue":false}'

有一种方法可以动态创建 'number' 变量并在 'wrk' 命令完成测试之前不断向数据库添加新项目吗?或者在测试期间继续执行脚本,将新的 'number' 变量插入到 'wrk.body' 中?

抱歉,我只看了几个小时的 Lua。

谢谢

点赞
用户5166781
用户5166781

当你这样做:

number = math.random

你并不是将 number 设置为一个随机数,而是将它等于函数 math.random。要将变量设置为函数返回的值,这一行应该是这样的:

number = math.random()

你可能还需要设置一个随机种子(使用 math.randomseed() 函数和适当的可变参数-系统时间很常见),以避免 math.random() 在每次运行脚本时给出相同的结果。这应该在第一次调用 math.random 之前完成。

由于脚本很短,系统时间可能不是一个好的种子选择(脚本运行比 os.time() 的值更快的多,所以连续几次运行它会每次给出相同的结果)。从 /dev/urandom 中读取几个字节应该可以得到更好的结果。

你也可以直接使用 /dev/urandom 生成一个数字,而不是将它作为种子提供给 math.random。就像下面的代码一样,来自 这个答案。这不是一个安全的随机数生成器,但对你的目的来说足够了。

urand = assert (io.open ('/dev/urandom', 'rb'))
rand  = assert (io.open ('/dev/random', 'rb'))

function RNG (b, m, r)
  b = b or 4
  m = m or 256
  r = r or urand
  local n, s = 0, r:read (b)

  for i = 1, s:len () do
    n = m * n + s:byte (i)
  end

  return n
end
2017-09-15 09:56:26