6.11压力与模拟测试
在开发面向互联网或需承受多人并发访问的应用系统时,性能压测和接口自动化模拟测试成为部署前的关键环节。通过这两项测试获取的报告指标,我们能在系统上线前对代码进行优化,确保其满足最低上线要求。
压力与模拟测试#
在开发面向互联网或需承受多人并发访问的应用系统时,性能压测和接口自动化模拟测试成为部署前的关键环节。通过这两项测试获取的报告指标,我们能在系统上线前对代码进行优化,确保其满足最低上线要求。
以 Furion 框架官网为例,进行压力测试:
var stressTestHarnessResult = await httpRemoteService.StressTestHarnessAsync("https://furion.net/");Console.WriteLine(stressTestHarnessResult.ToString()); // 打印压力测试结果测试结果概览:
Stress Test Harness Result: Total Requests: 100 // 总请求次数 Total Time (s): 7.95 // 总用时(秒) Successful Requests: 100 // 成功请求次数 Failed Requests: 0 // 失败请求次数 QPS: 12.58 // 每秒查询率 (QPS) Min RT (ms): 676.38 // 最小响应时间(毫秒) Max RT (ms): 7,419.72 // 最大响应时间(毫秒) Avg RT (ms): 3,314.94 // 平均响应时间(毫秒) P10 RT (ms): 1,288.82 // P10 响应时间(毫秒) P25 RT (ms): 2,057.10 // P25 响应时间(毫秒) P50 RT (ms): 3,064.56 // P50 响应时间(毫秒) P75 RT (ms): 4,100.03 // P75 响应时间(毫秒) P90 RT (ms): 5,026.08 // P90 响应时间(毫秒) P95 RT (ms): 7,330.71 // P95 响应时间(毫秒) P99 RT (ms): 7,416.20 // P99 响应时间(毫秒) P99.99 RT (ms): 7,419.72 // P99.99 响应时间(毫秒)stressTestHarnessResult 变量类型为 StressTestHarnessResult,包含以下属性和方法:
-
属性:
TotalRequests:总请求次数(long类型)。TotalTimeInSeconds:总用时(秒)(double类型)。SuccessfulRequests:成功请求次数(long类型)。FailedRequests:失败请求次数(long类型)。QueriesPerSecond:每秒查询率 (QPS)(double类型)。MinResponseTime:最小响应时间(毫秒)(double类型)。MaxResponseTime:最大响应时间(毫秒)(double类型)。AverageResponseTime:平均响应时间(毫秒)(double类型)。Percentile10ResponseTime:P10响应时间(毫秒)(double类型)。Percentile25ResponseTime:P25响应时间(毫秒)(double类型)。Percentile50ResponseTime:P50响应时间(毫秒)(double类型)。Percentile75ResponseTime:P75响应时间(毫秒)(double类型)。Percentile90ResponseTime:P90响应时间(毫秒)(double类型)。Percentile95ResponseTime:P95响应时间(毫秒)(double类型)。Percentile99ResponseTime:P99响应时间(毫秒)(double类型)。Percentile9999ResponseTime:P99.99响应时间(毫秒)(double类型)。
-
方法:
ToString():输出带缩进的详细报告字符串。
默认情况下,压力测试执行 1 轮,每次包含 100 个并发请求,最大并发度为 100。为获取更精确的测试结果,可按需调整这些参数:
var stressTestHarnessResult = await httpRemoteService.SendAsync(HttpRequestBuilder.StressTestHarness("https://furion.net/") .SetNumberOfRequests(1000) // 设置并发请求数量 .SetNumberOfRounds(5) // 设置压测轮次 .SetMaxDegreeOfParallelism(500)); // 设置最大并发度// 在大多数情况下,只需要设置并发请求数量即可var stressTestHarnessResult = await httpRemoteService.StressTestHarnessAsync("https://furion.net/", 500);var stressTestHarnessResult = await httpRemoteService.SendAsync(HttpRequestBuilder.StressTestHarness("https://furion.net/", 500));HttpStressTestHarnessBuilder 构建器#
HttpStressTestHarnessBuilder 构建器是框架提供专门用来进行压力与模拟测试所需的各项设置。HttpStressTestHarnessBuilder 的构造函数是私有的,因此无法直接使用 new 关键字进行实例化,不过,框架提供了 HttpRequestBuilder.StressTestHarness 的多个静态重载方法创建 HttpStressTestHarnessBuilder 的实例。
HttpRequestBuilder.StressTestHarness(httpMethod, requestUri, numberOfRequests, configure);HttpRequestBuilder.StressTestHarness(requestUri, numberOfRequests, configure); // 默认 GET 请求此外,HttpStressTestHarnessBuilder 包含以下配置功能:
// 默认为 GET 请求,默认并发请求数量为 100HttpRequestBuilder.StressTestHarness("https://furion.net/") // 设置并发请求数量,默认值 100 .SetNumberOfRequests(500) // 设置最大并发度,默认值 100 .SetMaxDegreeOfParallelism(500) // 设置压测轮次,默认值为 1 轮 .SetNumberOfRounds(5) // 设置禁用 HTTP 缓存 .DisableCache() // 设置 HttpRequestBuilder 实例 .With(builder => {});在通过 HttpRequestBuilder.StressTestHarness 方法成功构建 HttpStressTestHarnessBuilder 实例后,您可以利用 Send 方法或异步的 SendAsync 方法来执行发送操作。
httpRemoteService.Send(httpStressTestHarnessBuilder, HttpCompletionOption.ResponseContentRead, cancellationToken);await httpRemoteService.SendAsync(httpStressTestHarnessBuilder, HttpCompletionOption.ResponseContentRead, cancellationToken);