POST Api 的 Vegeta 负载测试

Posted

技术标签:

【中文标题】POST Api 的 Vegeta 负载测试【英文标题】:Vegeta load test for POST Api 【发布时间】:2016-06-29 14:24:22 【问题描述】:

我想使用 vegeta 测试一些 POST API,但 post 有效负载未正确发送。

vegeta 命令:

vegeta attack -targets=tmp -rate=1 -duration=1s | tee results.bin | vegeta report

tmp 文件:

POST http://server-ip/api/salon
@saloninfo.json

saloninfo.json 文件:


  "salon_id" : "562737c1ff567dbd5574c814"

基本上,有效负载会变空。

有人可以检查一下,我可能缺少什么。

【问题讨论】:

【参考方案1】:

我相信这应该可以解决问题:

POST http://server-ip/api/salon
Content-Type: application/json
@saloninfo.json

【讨论】:

【参考方案2】:

在这里提到另一种方式。如果您熟悉golang

,可能会很有用
import (
    "os"
    "time"

    "net/http"
    vegeta "github.com/tsenart/vegeta/lib"
)

func customTargeter() vegeta.Targeter 
    return func(tgt *vegeta.Target) error 
        if tgt == nil 
            return vegeta.ErrNilTarget
        

        tgt.Method = "POST"

        tgt.URL = "http://server-ip/api/salon" // your url here

        payload := `
            "salon_id" : "562737c1ff567dbd5574c814"
          ` // you can make this salon_id dynamic too, using random or uuid

        tgt.Body = []byte(payload)

        header := http.Header
        header.Add("Accept", "application/json")
        header.Add("Content-Type", "application/json")
        tgt.Header = header

        return nil
    


func main() 
    rate := vegeta.RateFreq: 1, Per: time.Second // change the rate here
    duration := 1 * time.Minute                    // change the duration here

    targeter := customTargeter()
    attacker := vegeta.NewAttacker()

    var metrics vegeta.Metrics
    for res := range attacker.Attack(targeter, rate, duration, "Whatever name") 
        metrics.Add(res)
    
    metrics.Close()

    reporter := vegeta.NewTextReporter(&metrics)
    reporter(os.Stdout)


我在这里所做的是,为攻击者对象提供速率、持续时间和目标函数。使用以下命令运行脚本:

go run name_of_the_file.go

NewTextReporter 用于在终端本身打印结果。 vegeta 库中还有其他类型的记者。根据需要使用它们。

【讨论】:

如果我想动态生成不同的有效载荷,这种方法非常方便/有用。【参考方案3】:

我相信这是因为您需要设置content type: application/json

不幸的是,文档和 github 问题间接地提到了它,但没有指明它应该在哪里,无论是作为 json 的标头还是在像 Curl 这样的 vegeta 命令中。仍然在这里寻找答案。

【讨论】:

以上是关于POST Api 的 Vegeta 负载测试的主要内容,如果未能解决你的问题,请参考以下文章

Vegeta HTTP稳定压力测试工具

如何对API进行负载测试与调优(一)

性能测试轻量级压测工具Hey

使用 vs2008 进行负载测试,如何从被测系统获取统计信息?

用于 Visual Studio 负载测试的 C# 线程安全随机长

如何使用 swagger 使用 json 作为有效负载的 post 请求创建 api