Gobot是一个功能强大的有状态API测试机器人。它提供图形界面进行测试场景的搭建,可以方便的进行测试脚本编写、单步调试和压力测试,并可以在测试过程的每个阶段之间共享和存储状态。
- 进入最新的 release页面 下载可执行程序
- 执行 gobot_driver_win_x64_v0.3.8 目录中的 start.bat 文件, 运行服务器
- 执行 gobot_editor_win_x64_v0.3.8 目录中的 gobot.exe, 运行编辑器程序
- 在弹出的地址输入窗口 或 config 页的地址栏中填入 http://127.0.0.1:8888 本地服务器地址
- 使用
行为树
控制机器人的运行逻辑,使用脚本
控制节点的具体行为(比如发起一次http请求 - 提供图形化的编辑,调试能力
- 可以
预制
模版节点,在编辑器中直接使用预制过的节点(可通过标签筛选 - 可以通过 http api
'curl post /bot.run -d '{"Name":"某个机器人"}'
驱动一个阻塞式的机器人,通过这种方式可以方便的集成进CI
中的测试流程 - 支持多种协议格式(HTTP, TCP, WebSocket ... ,且支持在脚本层自行对字节流 pack/unpack
- 可以进行
压力测试
(可以在配置页设置不同的并发策略 - 提供压力测试后的API/协议
报告
查看
通过内置的模块+脚本可以使我们拥有丰富的逻辑表达能力,也可以使用全局的(单个bot)meta 结构来维护 bot 的各种状态变更
--[[
每个节点都拥有一个独立属于自己的 .lua 脚本,当节点被执行到的时候会调用 dostring 加载并运行这个脚本
]]--
-- 用户可以在脚本中加载自己想要使用的 “模块”
-- document https://pojol.gitee.io/gobot/#/zh-cn/script/meta
local http = require("http")
-- 定义一些逻辑所需的结构
req = {
body = {}, -- post body
timeout = "10s", -- http timeout
headers = {}, -- http headers
}
-- 当脚本成功加载后,会调用这个 execute 函数
function execute()
-- 用户可以在这里自行定义节点的执行逻辑(例如发送一次http请求
res, err = http.post("url", req)
-- todo
-- 返回值
-- state 状态码
-- res 显示在 Response 面板的信息
return state.Succ, res
end
Module | interface | Description |
---|---|---|
base64 | encode decode |
Provides base64 encoding/decoding functionality. |
http | post get put |
Support HTTP connection. |
tcp | dail close write read |
Support TCP connection. |
websocket | dail close write read |
Support WebSocket connection. |
protobuf | marshal unmarshal |
Provides Protobuf operations. |
mongoDB | insert find update delete ... |
Provides MongoDB operations. |
json | encode decode |
Offers JSON functionalities. |
md5 | sum |
Calculates MD5 hashes. |
utils | uuid random |
Generates random values, UUIDs. |
... | More modules available. |
示例 message.lua 位于 script/ 用户可以参考里面的实现,更改自己项目中的协议包解析方式
-- message.lua
function TCPUnpackMsg(msglen, buf, errmsg)
if errmsg ~= "nil" then
return 0, ""
end
local msg = message.new(buf, ByteOrder, 0)
local msgTy = msg:readi1()
local msgCustom = msg:readi2()
local msgId = msg:readi2()
local msgbody = msg:readBytes(msglen-(2+1+2+2), -1)
return msgId, msgbody
end
function TCPPackMsg(msgid, msgbody)
local msglen = #msgbody+2+1+2+2
local msg = message.new("", ByteOrder, msglen)
msg:writei2(msglen)
msg:writei1(1)
msg:writei2(0)
msg:writei2(msgid)
msg:writeBytes(msgbody)
return msg:pack()
end
-- use
--------------------------------------------------------
-- 使用 proto.marshal 序列化
-- 使用 TCPPackMsg 组装 TCP 报文
local reqbody, errmsg = proto.marshal("HelloReq", json.encode({
Message = "hello",
}))
ret = conn.write(TCPPackMsg(1002, reqbody))
--------------------------------------------------------
-- 2 是 message length 的设计字节长度,conn会首先尝试读取指定的字节数用于解析报文大小
-- 通过 msgid 解析协议报文内容
-- TCPUnpackMsg 用户可以自行定义,不一定按 msgid, msgbody 的形式返回,也可以是 msghead, msgbody 看用户的报文结构设计
msgid, msgbody = TCPUnpackMsg(conn.read(2))
if msgid == 1002 then
body = proto.unmarshal("HelloRes", msgbody)
end