zoukankan      html  css  js  c++  java
  • 【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

  • 相关阅读:
    一个printf(结构体指针)引发的血案
    C语言指针从底层原理到花式技巧,用图文和代码帮你讲解透彻
    利用C语言中的setjmp和longjmp,来实现异常捕获和协程
    提高代码逼格的利器:宏定义从入门到放弃
    我最喜欢的进程之间通信方式消息总线
    推荐一个阅读代码、文档的利器:屏幕贴图工具
    计算机网络基础知识总结
    vi指令总结
    LVS 负载均衡器理论基础及抓包分析
    Linux命令总结大全,包含所有linux命令
  • 原文地址:https://www.cnblogs.com/Detector/p/11469233.html
Copyright © 2011-2022 走看看