package starnet import ( "fmt" "net/http" "net/http/httptest" "runtime" "testing" ) // BenchmarkGetRequest 测试单个 GET 请求的性能 func BenchmarkGetRequest(b *testing.B) { // 创建测试服务器 server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { rw.Write([]byte(`OK`)) })) defer server.Close() // 重置计时器,排除设置代码的影响 b.ResetTimer() // 报告内存分配情况 b.ReportAllocs() // 运行基准测试 for i := 0; i < b.N; i++ { resp, err := Get(server.URL, WithSkipTLSVerify(true)) if err != nil { b.Errorf("Unexpected error: %v", err) } body := resp.Body().String() if body != "OK" { b.Errorf("Expected OK, got %v", body) } } } // BenchmarkGetRequestWithHeaders 测试带请求头的 GET 请求性能 func BenchmarkGetRequestWithHeaders(b *testing.B) { server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { // 验证请求头 if req.Header.Get("hello") != "world" { rw.WriteHeader(http.StatusBadRequest) return } rw.Write([]byte(`OK`)) })) defer server.Close() b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { resp, err := Get(server.URL, WithSkipTLSVerify(true), WithHeader("hello", "world"), WithUserAgent("hello world")) if err != nil { b.Errorf("Unexpected error: %v", err) } body := resp.Body().String() if body != "OK" { b.Errorf("Expected OK, got %v", body) } } } // BenchmarkPostRequest 测试 POST 请求的性能 func BenchmarkPostRequest(b *testing.B) { server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { // 读取并返回请求体 body := make([]byte, req.ContentLength) req.Body.Read(body) rw.Write(body) })) defer server.Close() testData := "This is a test payload for POST request" b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { resp, err := Post(server.URL, WithSkipTLSVerify(true), WithBytes([]byte(testData)), WithContentType("text/plain")) if err != nil { b.Errorf("Unexpected error: %v", err) } body := resp.Body().String() if body != testData { b.Errorf("Expected %s, got %v", testData, body) } } } // BenchmarkConcurrentRequests 测试并发请求性能 func BenchmarkConcurrentRequests(b *testing.B) { server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { rw.Write([]byte(`OK`)) })) defer server.Close() b.ResetTimer() b.ReportAllocs() // 运行并发基准测试 b.RunParallel(func(pb *testing.PB) { for pb.Next() { resp, err := Get(server.URL, WithSkipTLSVerify(true)) if err != nil { b.Errorf("Unexpected error: %v", err) } body := resp.Body().String() if body != "OK" { b.Errorf("Expected OK, got %v", body) } } }) } // BenchmarkMemoryUsage 专门测试内存使用情况 func BenchmarkMemoryUsage(b *testing.B) { server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { rw.Write([]byte(`OK`)) })) defer server.Close() // 禁用默认的测试时间,只关注内存分配 b.ReportAllocs() var memStatsStart, memStatsEnd runtime.MemStats runtime.GC() runtime.ReadMemStats(&memStatsStart) for i := 0; i < b.N; i++ { resp, err := Get(server.URL, WithSkipTLSVerify(true)) if err != nil { b.Errorf("Unexpected error: %v", err) } body := resp.Body().String() if body != "OK" { b.Errorf("Expected OK, got %v", body) } } runtime.GC() runtime.ReadMemStats(&memStatsEnd) // 计算每次操作的平均内存分配 allocsPerOp := float64(memStatsEnd.Mallocs-memStatsStart.Mallocs) / float64(b.N) bytesPerOp := float64(memStatsEnd.TotalAlloc-memStatsStart.TotalAlloc) / float64(b.N) b.ReportMetric(allocsPerOp, "allocs/op") b.ReportMetric(bytesPerOp, "bytes/op") } // BenchmarkDifferentResponseSizes 测试不同响应大小的性能 func BenchmarkDifferentResponseSizes(b *testing.B) { // 测试不同大小的响应 responseSizes := []int{100, 1024, 10240, 102400} // 100B, 1KB, 10KB, 100KB for _, size := range responseSizes { // 生成指定大小的响应数据 responseData := make([]byte, size) for i := 0; i < size; i++ { responseData[i] = 'A' } b.Run(fmt.Sprintf("Size_%d", size), func(b *testing.B) { server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) { rw.Write(responseData) })) defer server.Close() b.ResetTimer() b.ReportAllocs() for i := 0; i < b.N; i++ { resp, err := Get(server.URL, WithSkipTLSVerify(true)) if err != nil { b.Errorf("Unexpected error: %v", err) } body := resp.Body().Bytes() if len(body) != size { b.Errorf("Expected size %d, got %d", size, len(body)) } } }) } }