有没有办法在 vegeta.post 请求负载测试中更改 json 主体。
我想在每个请求的 json 正文中发送一个带有不同参数的请求。例如,如果我有
POST https://endpoint.com/createNew
@/targets/data.json
和 data.json 看起来像
{
"id": 1234
}
最好的方法是什么,以便我们为攻击中的每个请求提供不同的请求数据?
有没有办法在 vegeta.post 请求负载测试中更改 json 主体。
我想在每个请求的 json 正文中发送一个带有不同参数的请求。例如,如果我有
POST https://endpoint.com/createNew
@/targets/data.json
和 data.json 看起来像
{
"id": 1234
}
最好的方法是什么,以便我们为攻击中的每个请求提供不同的请求数据?
我需要做一些类似的事情,并决定为此使用 vegeta lib 而不是 cli,这允许我控制 HTTP 请求
所以你需要编写你自己的函数来返回一个vegeta.Targeter
func NewCustomTargeter() vegeta.Targeter {
return func(tgt *vegeta.Target) error {
if tgt == nil {
return vegeta.ErrNilTarget
}
tgt.Method = "POST"
tgt.URL = "https://endpoint.com/createNew"
rand := generateFourDigitRandom()
payload := '{ "id":"`+rand+ `" } `
tgt.Body = []byte(payload)
return nil
}
}
并像这样在主函数中使用这个函数
targeter := NewCustomTargeter()
attacker := vegeta.NewAttacker()
var metrics vegeta.Metrics
for res := range attacker.Attack(targeter, rate, duration, "Load Test") {
metrics.Add(res)
}
metrics.Close()
fmt.Printf("%+v \n", metrics)
2018 年 7 月 10 日,vegeta#PR300引入了该-format=json
选项。这是vegeta README描述:
JSON 格式使得与动态生成目标的程序的集成更加容易。每个目标都是在其自己的行中的一个 JSON 对象。方法和 url 字段是必需的。如果存在,body 字段必须是 base64 编码的。生成的 JSON Schema 详细定义了格式。
他们提供的例子:
jq -ncM '{method: "GET", url: "http://goku", body: "Punch!" | @base64, header: {"Content-Type": ["text/plain"]}}' |
vegeta attack -format=json -rate=100 | vegeta encode
如果您在targets
文件夹下有多个文件并且想在负载测试中使用它们,我建议您进行以下配置:
将其配置为指向您的targets
文件夹:
在您的HTTP 请求采样器中使用__FileToString()函数,例如:
${__FileToString(${filename},,)}
当您运行测试时,它将从targets
目录中获取下一个文件并将其内容用作请求正文