【问题标题】:How I will do load test(vegeta) for multiple methods multiple in golang我将如何在 golang 中为多种方法进行负载测试(vegeta)
【发布时间】:2019-03-19 22:47:27
【问题描述】:

假设我有一个 api 有两条路线,一条用于保存用户,另一条用于获取下面给出的用户:-

router.go

package main

import (
    "github.com/gin-gonic/gin"
    "go-training/postAPI/controller"
)

type Route struct {
    Name        string
    Method      string
    Pattern     string
    HandlerFunc func(*gin.Context)
}

type Routes []Route

var routes = Routes{
    Route{"SaveUser", "POST", "/post", controller.SaveUser},
    Route{"GetUser", "GET", "/post/:id", controller.GetUser},
}
func NewRouter() {
    router := gin.Default()
    v1 := router.Group("/api/v1")
    for _, route := range routes {
        switch route.Method {
        case "GET":
            v1.GET(route.Pattern, route.HandlerFunc)
        case "POST":
            v1.POST(route.Pattern, route.HandlerFunc)
        case "PUT":
            v1.PUT(route.Pattern, route.HandlerFunc)
        case "DELETE":
            v1.DELETE(route.Pattern, route.HandlerFunc)
        default:
            v1.GET(route.Pattern, func(c *gin.Context) {
                c.JSON(200, gin.H{
                    "result": "Specify a valid http method with this route.",
                })
            })
        }
    }
    router.Run(":8080")
}

通过点击这些 url localhost:8080/api/v1/post 方法:- POST 邮递员它将从邮递员那里获取 json 数据并进入数据库,同时获取用户 url localhost:8080/api/v1/post/:id 方法:- GET 邮递员然后它将返回与输入的 id 匹配的用户。现在,我想对这些 api 进行负载测试(vegeta),因为我想看看在一秒钟内需要多少请求。我阅读了this link 并实现了程序,但我不知道如何分别对我的 api 进行负载测试。

谁能告诉我,我将如何进行这两个 api 的负载测试或任何参考?

已编辑

main.go

package main

func main() {
    NewRouter()
    GetVegeta()
}

vegeta.go

// Panic if there is an error
func check(err error) {
    if err != nil {
        panic(err)
    }
}
func GetVegeta() {
    var (
        users int
    )

    // The Go random number generator source is deterministic, so we need to seed    
    // Configure our command line app
    app := cli.NewApp()
    app.Name = "Pokemon User Data Generator"
    app.Usage = "generate a stream of test data for vegeta. Type 'pokemon help' for details"

    // Add -users flag, which defaults to 5
    app.Flags = []cli.Flag{
        cli.IntFlag{
            Name: "users",
        },
    }

    // Our app's main action
    app.Action = func(c *cli.Context) error {
    // Combine verb and URL to a target for Vegeta
        verb := c.Args().Get(0)
        url := c.Args().Get(1)
        target := fmt.Sprintf("%s %s", verb, url)
        fmt.Println(verb)
        fmt.Println(url)
        fmt.Println(target)
        if len(target) > 1 {

            for i := 1; i < users; i++ {
                fmt.Println(users)
            }
        } else {
            // Return an error if we're missing the required command line arguments
            return cli.NewExitError("You must specify the target in format 'VERB url'", 1)
        }
        return nil
    }

    app.Run(os.Args)
}

这些文件位于相同的文件夹名称Template。我正在使用命令 ./Template -users=10 GET https://localhost:8080/api/v1/customer | vegeta attack -rate=10 -duration=30s | vegeta report

运行整个文件夹

通过运行所有 api 的运行,当我从邮递员那里点击任何 api 时,它会给我 bad method: [GIN]encode: can't detect encoding of "stdin"错误 我将如何解决这个问题以进行报告我的 api 的。

感谢您宝贵的时间!

【问题讨论】:

  • 你能给我们看看你写的vegata文件吗?
  • @mbuechmann 查看编辑我编辑我的问题
  • 嗨@misha 你已经包含了你的整个程序。那是一个开始。但是,如果您将代码减少到相关部分,您的问题会更容易回答。见minimal reproducible example
  • @mbuechmann 你能告诉我有没有参考程序可以让我在 vegeta 攻击下使用它来测试多条路线。
  • 没有这样的东西。只需使用常识并问自己:“这部分是否相关”?例如。您的主要功能不相关。您的路线不相关,至少不是所有路线。所有这些 fmt.Printlns 也是如此,等等。

标签: go postman load-testing go-gin


【解决方案1】:

Vegeta 采用并发和时间参数,您可以从中创建报告。

【讨论】:

    【解决方案2】:

    你可以使用 https://linux.die.net/man/1/siege 它允许您测试 API 并生成报告

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      相关资源
      最近更新 更多