Vegeta HTTP 负载测试工具

Go接口压测的第三方包,一个很好用的负载测试工具。vegeta测试工具组件(可执行文件)支持linux以及mac系统,这里指的是通过终端命令行进行进行测试,不需要从代码层面使用这个工具的时候支持linux以及mac系统,在windows上可能会出现问题。但是通过vegeta包代码执行的时候是可以在多平台执行的,但是在数据的展示上会有局限性,当然也可能是博主本人不会用没有找到对应的使用方式。

比如测试工具组件执行完命令后可以在终端控制台很直观的看到Histogram图,但是在代码层面测试后就很难分析出Histogram的情况

下面贴一下代码层面的吧,至于组件的方式大家百度一下有很多详细的教程

http的形式

传参,用户验证参数

package main

import (
	"encoding/base64"
	"encoding/json"
	"fmt"
	vegeta "github.com/tsenart/vegeta/lib"
	"net/http"
	"time"
)

func main() {
	// 测试目标 URL
	target := "https://your.domain.name/"
	// 测试参数
	rate := 20                  // 每秒请求数
	duration := 1 * time.Second // 测试时间

	// 请求体数据
	data := map[string]string{
		"key1": "value1",
		"key2": "value2",
	}
	body, _ := json.Marshal(&data)

	// Basic验证
	authString := "user:password"
	encodedAuthString := base64.StdEncoding.EncodeToString([]byte(authString))
	headers := http.Header{
		"Content-Type":  []string{"application/json"},
		"Authorization": []string{"Basic " + encodedAuthString},
	}

	// 使用自定义transport创建attacker
	attacker := vegeta.NewAttacker()

	// 创建 vegeta 目标
	targets := []vegeta.Target{{Method: "GET", URL: target, Header: headers, Body: body}}

	// 创建和执行 vegeta 测试
	results := attacker.Attack(vegeta.NewStaticTargeter(targets...), vegeta.Rate{Freq: rate, Per: time.Second}, duration, "Load Test")
	// 分析结果
	metrics := &vegeta.Metrics{}
	for res := range results {
		metrics.Add(res)
	}

	metrics.Close()
	// 打印结果
	fmt.Printf("Requests: %d\n", metrics.Requests)
	fmt.Printf("成功率: %.2f%%\n", metrics.Success*100)
	fmt.Printf("最大延迟: %s\n", metrics.Latencies.Max)
	fmt.Printf("平均延迟: %s\n", metrics.Latencies.Mean)
	fmt.Printf("P95 延迟: %s\n", metrics.Latencies.P95)
	fmt.Printf("P99 延迟: %s\n", metrics.Latencies.P99)
	fmt.Printf("QPS: %.2f\n", metrics.Rate)
}

Https的形式

传参,用户验证参数,跨过证书验证

package main

import (
	"crypto/tls"
	"encoding/base64"
	"encoding/json"
	"fmt"
	vegeta "github.com/tsenart/vegeta/lib"
	"net/http"
	"time"
)

func main() {
	// 测试目标 URL
	target := "https://your.domain.name/"
	// 测试参数
	rate := 20                  // 每秒请求数
	duration := 1 * time.Second // 测试时间

	// 请求体数据
	data := map[string]string{
		"key1": "value1",
		"key2": "value2",
	}
	body, _ := json.Marshal(&data)

	// Basic验证
	authString := "user:password"
	encodedAuthString := base64.StdEncoding.EncodeToString([]byte(authString))
	headers := http.Header{
		"Content-Type":  []string{"application/json"},
		"Authorization": []string{"Basic " + encodedAuthString},
	}

	// 创建http.Transport以跳过证书验证
	transport := &http.Transport{
		TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
	}

	// 使用自定义transport创建attacker
	attacker := vegeta.NewAttacker(vegeta.Client(&http.Client{Transport: transport}))

	// 创建 vegeta 目标
	targets := []vegeta.Target{{Method: "GET", URL: target, Header: headers, Body: body}}

	// 创建和执行 vegeta 测试
	results := attacker.Attack(vegeta.NewStaticTargeter(targets...), vegeta.Rate{Freq: rate, Per: time.Second}, duration, "Load Test")

	// 分析结果
	metrics := &vegeta.Metrics{}
	for res := range results {
		metrics.Add(res)
	}

	metrics.Close()
	// 打印结果
	fmt.Printf("Requests: %d\n", metrics.Requests)
	fmt.Printf("成功率: %.2f%%\n", metrics.Success*100)
	fmt.Printf("最大延迟: %s\n", metrics.Latencies.Max)
	fmt.Printf("平均延迟: %s\n", metrics.Latencies.Mean)
	fmt.Printf("P95 延迟: %s\n", metrics.Latencies.P95)
	fmt.Printf("P99 延迟: %s\n", metrics.Latencies.P99)
	fmt.Printf("QPS: %.2f\n", metrics.Rate)
}
posted @ 2023-06-28 14:15  HashFlag  阅读(112)  评论(0编辑  收藏  举报