6.11压力与模拟测试

在开发面向互联网或需承受多人并发访问的应用系统时,性能压测和接口自动化模拟测试成为部署前的关键环节。通过这两项测试获取的报告指标,我们能在系统上线前对代码进行优化,确保其满足最低上线要求。

压力与模拟测试#

在开发面向互联网或需承受多人并发访问的应用系统时,性能压测和接口自动化模拟测试成为部署前的关键环节。通过这两项测试获取的报告指标,我们能在系统上线前对代码进行优化,确保其满足最低上线要求。

Furion 框架官网为例,进行压力测试:

cs
var stressTestHarnessResult = await httpRemoteService.StressTestHarnessAsync("https://furion.net/");Console.WriteLine(stressTestHarnessResult.ToString());  // 打印压力测试结果

测试结果概览:

bash
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 类型)。
    • Percentile10ResponseTimeP10 响应时间(毫秒)(double 类型)。
    • Percentile25ResponseTimeP25 响应时间(毫秒)(double 类型)。
    • Percentile50ResponseTimeP50 响应时间(毫秒)(double 类型)。
    • Percentile75ResponseTimeP75 响应时间(毫秒)(double 类型)。
    • Percentile90ResponseTimeP90 响应时间(毫秒)(double 类型)。
    • Percentile95ResponseTimeP95 响应时间(毫秒)(double 类型)。
    • Percentile99ResponseTimeP99 响应时间(毫秒)(double 类型)。
    • Percentile9999ResponseTimeP99.99 响应时间(毫秒)(double 类型)。
  • 方法

    • ToString():输出带缩进的详细报告字符串。

默认情况下,压力测试执行 1 轮,每次包含 100 个并发请求,最大并发度为 100。为获取更精确的测试结果,可按需调整这些参数:

cs
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 的实例。

cs
HttpRequestBuilder.StressTestHarness(httpMethod, requestUri, numberOfRequests, configure);HttpRequestBuilder.StressTestHarness(requestUri, numberOfRequests, configure); // 默认 GET 请求

此外,HttpStressTestHarnessBuilder 包含以下配置功能:

cs
// 默认为 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 方法来执行发送操作。

cs
httpRemoteService.Send(httpStressTestHarnessBuilder, HttpCompletionOption.ResponseContentRead, cancellationToken);await httpRemoteService.SendAsync(httpStressTestHarnessBuilder, HttpCompletionOption.ResponseContentRead, cancellationToken);