【locust】使用locust + boomer实现对接口的压测

背景

很早之前,考虑单机执行能力,使用locust做过公司短信网关的压测工作,后来发现了一个golang版本的locust,性能是python版本的5到10倍以上,但是一直没有机会使用。

最近公司想做一个性能测试平台,技术选型要求和开发的语言一致,即golang,所以我想到了boomer,本文为boomer的使用记录。

环境安装

开发环境 安装
Python 3.7
locust 0.11.0 pip install locustio
golang
boomer go get github.com/myzhan/boomer

注:最新版本的boomer兼容了goczmq,需要将locust升级到较高版本才能完成兼容。

脚本编写

master

这部分的代码不重要,只要能启动就行。

from locust import Locust, TaskSet, task

class MyTaskSet(TaskSet):
    @task(20)
    def hello(self):
        pass

class Dummy(Locust):
    task_set = MyTaskSet

slave节点(golang/boomer)

package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "log"
    "net/http"
    "time"

    "github.com/myzhan/boomer"
)

func getDemo() {
    start := time.Now()
    resp, err := http.Get("http://httpbin.org/get?name=Detector")

    if err != nil {
        log.Println(err)
        return
    }
    defer resp.Body.Close()
    fmt.Println(resp.Status)
    elapsed := time.Since(start)
    if resp.Status == "200 OK" {
        boomer.RecordSuccess("http", "sostreq", elapsed.Nanoseconds()/int64(time.Millisecond), int64(10))
    } else {
        boomer.RecordFailure("http", "sostreq", elapsed.Nanoseconds()/int64(time.Millisecond), "sostreq not equal")
    }
}

func postDemo() {
    start := time.Now()

    info := make(map[string]interface{})
    info["name"] = "Detector"
    info["age"] = 15
    info["loc"] = "深圳"
    // 将map解析未[]byte类型
    bytesData, _ := json.Marshal(info)
    // 将解析之后的数据转为*Reader类型
    reader := bytes.NewReader(bytesData)
    resp, _ := http.Post("http://httpbin.org/post",
        "application/json",
        reader)
    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
    elapsed := time.Since(start)
    if resp.Status == "200 OK" {
        boomer.RecordSuccess("http", "sostreq", elapsed.Nanoseconds()/int64(time.Millisecond), int64(10))
    } else {
        boomer.RecordFailure("http", "sostreq", elapsed.Nanoseconds()/int64(time.Millisecond), "sostreq not equal")
    }
}

func main() {
    task1 := &boomer.Task{
        Name: "sostreq",
        // The weight is used to distribute goroutines over multiple tasks.
        Weight: 20,
        Fn:     getDemo,
    }

    task2 := &boomer.Task{
        Name: "sostreq",
        // The weight is used to distribute goroutines over multiple tasks.
        Weight: 10,
        Fn:     postDemo,
    }
    boomer.Run(task1, task2)
}

实际效果如下:
![]()

![]()

问题

Failed to execute dot. Is Graphviz installed? Error: exec: "dot": executable file not found in $PATH

声明:该文章系转载,转载该文章的目的在于更广泛的传递信息,并不代表本网站赞同其观点,文章内容仅供参考。

本站是一个个人学习和交流平台,网站上部分文章为网站管理员和网友从相关媒体转载而来,并不用于任何商业目的,内容为作者个人观点, 并不代表本网站赞同其观点和对其真实性负责。

我们已经尽可能的对作者和来源进行了通告,但是可能由于能力有限或疏忽,导致作者和来源有误,亦可能您并不期望您的作品在我们的网站上发布。我们为这些问题向您致歉,如果您在我站上发现此类问题,请及时联系我们,我们将根据您的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。