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)
}