mirror of
https://github.com/GeWuYou/GFramework.git
synced 2026-05-07 00:39:00 +08:00
test(cqrs): 收口高级特性测试的CQRS命名
- 重命名高级特性测试类、命名空间与文件路径,统一到 CQRS 与 ArchitectureContext 语义 - 更新测试方法名、中文注释与日志器名称,移除残留的 Mediator 命名 - 补充当前测试文件内辅助类型的 XML 文档,保持测试行为不变
This commit is contained in:
parent
22f608eb4d
commit
e1af8ac833
@ -4,15 +4,20 @@ using GFramework.Core.Ioc;
|
|||||||
using GFramework.Core.Logging;
|
using GFramework.Core.Logging;
|
||||||
using GFramework.Cqrs.Abstractions.Cqrs;
|
using GFramework.Cqrs.Abstractions.Cqrs;
|
||||||
|
|
||||||
namespace GFramework.Cqrs.Tests.Mediator;
|
namespace GFramework.Cqrs.Tests.Cqrs;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Mediator高级特性专项测试
|
/// 验证 CQRS 请求通过 <see cref="ArchitectureContext" /> 分发时的高级行为与边界场景。
|
||||||
/// 专注于测试Mediator框架的高级功能和边界场景
|
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[TestFixture]
|
[TestFixture]
|
||||||
public class MediatorAdvancedFeaturesTests
|
internal sealed class CqrsArchitectureContextAdvancedFeaturesTests
|
||||||
{
|
{
|
||||||
|
private MicrosoftDiContainer? _container;
|
||||||
|
private ArchitectureContext? _context;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 初始化测试容器、日志器和 CQRS 处理器注册表。
|
||||||
|
/// </summary>
|
||||||
[SetUp]
|
[SetUp]
|
||||||
public void SetUp()
|
public void SetUp()
|
||||||
{
|
{
|
||||||
@ -23,17 +28,20 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
var loggerField = typeof(MicrosoftDiContainer).GetField("_logger",
|
var loggerField = typeof(MicrosoftDiContainer).GetField("_logger",
|
||||||
BindingFlags.NonPublic | BindingFlags.Instance);
|
BindingFlags.NonPublic | BindingFlags.Instance);
|
||||||
loggerField?.SetValue(_container,
|
loggerField?.SetValue(_container,
|
||||||
LoggerFactoryResolver.Provider.CreateLogger(nameof(MediatorAdvancedFeaturesTests)));
|
LoggerFactoryResolver.Provider.CreateLogger(nameof(CqrsArchitectureContextAdvancedFeaturesTests)));
|
||||||
|
|
||||||
CqrsTestRuntime.RegisterHandlers(
|
CqrsTestRuntime.RegisterHandlers(
|
||||||
_container,
|
_container,
|
||||||
typeof(MediatorAdvancedFeaturesTests).Assembly,
|
typeof(CqrsArchitectureContextAdvancedFeaturesTests).Assembly,
|
||||||
typeof(ArchitectureContext).Assembly);
|
typeof(ArchitectureContext).Assembly);
|
||||||
|
|
||||||
_container.Freeze();
|
_container.Freeze();
|
||||||
_context = new ArchitectureContext(_container);
|
_context = new ArchitectureContext(_container);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 释放当前测试用到的上下文和容器引用。
|
||||||
|
/// </summary>
|
||||||
[TearDown]
|
[TearDown]
|
||||||
public void TearDown()
|
public void TearDown()
|
||||||
{
|
{
|
||||||
@ -41,11 +49,9 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
_container = null;
|
_container = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private MicrosoftDiContainer? _container;
|
/// <summary>
|
||||||
|
/// 验证请求验证逻辑会阻止无效输入继续进入 CQRS 处理流程。
|
||||||
private ArchitectureContext? _context;
|
/// </summary>
|
||||||
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Request_With_Validation_Behavior_Should_Validate_Input()
|
public async Task Request_With_Validation_Behavior_Should_Validate_Input()
|
||||||
{
|
{
|
||||||
@ -68,8 +74,11 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
Assert.That(TestRetryBehavior.AttemptCount, Is.EqualTo(1));
|
Assert.That(TestRetryBehavior.AttemptCount, Is.EqualTo(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证高并发 CQRS 请求可以在合理时间内全部完成。
|
||||||
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public async Task High_Concurrency_Mediator_Requests_Should_Handle_Efficiently()
|
public async Task High_Concurrency_Cqrs_Requests_Should_Handle_Efficiently()
|
||||||
{
|
{
|
||||||
const int concurrentRequests = 100;
|
const int concurrentRequests = 100;
|
||||||
var tasks = new List<Task<int>>();
|
var tasks = new List<Task<int>>();
|
||||||
@ -93,6 +102,9 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
Assert.That(stopwatch.ElapsedMilliseconds, Is.LessThan(5000)); // 5秒内完成
|
Assert.That(stopwatch.ElapsedMilliseconds, Is.LessThan(5000)); // 5秒内完成
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证大批量请求下的内存占用不会出现明显泄漏。
|
||||||
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Memory_Usage_Should_Remain_Stable_Under_Heavy_Load()
|
public async Task Memory_Usage_Should_Remain_Stable_Under_Heavy_Load()
|
||||||
{
|
{
|
||||||
@ -132,6 +144,9 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
Assert.That(TestTransientErrorHandler.ErrorCount, Is.EqualTo(0));
|
Assert.That(TestTransientErrorHandler.ErrorCount, Is.EqualTo(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证断路器在持续失败后会快速拒绝后续请求。
|
||||||
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Circuit_Breaker_Should_Prevent_Cascading_Failures()
|
public async Task Circuit_Breaker_Should_Prevent_Cascading_Failures()
|
||||||
{
|
{
|
||||||
@ -160,6 +175,9 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
Assert.That(stopwatch.ElapsedMilliseconds, Is.LessThan(100));
|
Assert.That(stopwatch.ElapsedMilliseconds, Is.LessThan(100));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证多步 Saga 请求在全部成功时会保持一致的完成状态。
|
||||||
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Saga_Pattern_With_Multiple_Requests_Should_Maintain_Consistency()
|
public async Task Saga_Pattern_With_Multiple_Requests_Should_Maintain_Consistency()
|
||||||
{
|
{
|
||||||
@ -182,6 +200,9 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
Assert.That(sagaData.IsCompleted, Is.True);
|
Assert.That(sagaData.IsCompleted, Is.True);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证 Saga 在中途失败时会触发既有步骤的补偿逻辑。
|
||||||
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Saga_With_Failure_Should_Rollback_Correctly()
|
public async Task Saga_With_Failure_Should_Rollback_Correctly()
|
||||||
{
|
{
|
||||||
@ -205,6 +226,9 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
Assert.That(sagaData.IsCompleted, Is.False);
|
Assert.That(sagaData.IsCompleted, Is.False);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证请求链可以在同一架构上下文中顺序完成。
|
||||||
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Request_Chaining_With_Dependencies_Should_Work_Correctly()
|
public async Task Request_Chaining_With_Dependencies_Should_Work_Correctly()
|
||||||
{
|
{
|
||||||
@ -213,8 +237,11 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
Assert.That(chainResult, Is.EqualTo("Chain completed: Step1 -> Step2 -> Step3"));
|
Assert.That(chainResult, Is.EqualTo("Chain completed: Step1 -> Step2 -> Step3"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证 CQRS 请求依赖外部服务时会正确传播取消超时。
|
||||||
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Mediator_With_External_Service_Dependency_Should_Handle_Timeouts()
|
public async Task Cqrs_With_External_Service_Dependency_Should_Handle_Timeouts()
|
||||||
{
|
{
|
||||||
using var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(100));
|
using var cts = new CancellationTokenSource(TimeSpan.FromMilliseconds(100));
|
||||||
var request = new TestExternalServiceRequest { TimeoutMs = 1000 };
|
var request = new TestExternalServiceRequest { TimeoutMs = 1000 };
|
||||||
@ -223,8 +250,11 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
await _context!.SendRequestAsync(request, cts.Token).ConfigureAwait(false));
|
await _context!.SendRequestAsync(request, cts.Token).ConfigureAwait(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 验证 CQRS 请求封装数据库写入时仍能保持事务语义上的可观察结果。
|
||||||
|
/// </summary>
|
||||||
[Test]
|
[Test]
|
||||||
public async Task Mediator_With_Database_Operations_Should_Handle_Transactions()
|
public async Task Cqrs_With_Database_Operations_Should_Handle_Transactions()
|
||||||
{
|
{
|
||||||
var testData = new List<string>();
|
var testData = new List<string>();
|
||||||
var request = new TestDatabaseRequest { Data = "test data", Storage = testData };
|
var request = new TestDatabaseRequest { Data = "test data", Storage = testData };
|
||||||
@ -236,12 +266,16 @@ public class MediatorAdvancedFeaturesTests
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 这些高级特性测试需要把一组仅供当前文件使用的辅助类型共置,避免拆成多个噪声文件。
|
// 这些 CQRS/ArchitectureContext 高级场景测试需要把一组仅供当前文件使用的辅助类型共置,避免拆成多个噪声文件。
|
||||||
#pragma warning disable MA0048
|
#pragma warning disable MA0048
|
||||||
#region Advanced Test Classes
|
#region Advanced Test Classes
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理重试请求,并在达到成功条件前累积尝试次数。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestRetryRequestHandler : IRequestHandler<TestRetryRequest, string>
|
public sealed class TestRetryRequestHandler : IRequestHandler<TestRetryRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public ValueTask<string> Handle(TestRetryRequest request, CancellationToken cancellationToken)
|
public ValueTask<string> Handle(TestRetryRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
TestRetryBehavior.AttemptCount++;
|
TestRetryBehavior.AttemptCount++;
|
||||||
@ -255,8 +289,12 @@ public sealed class TestRetryRequestHandler : IRequestHandler<TestRetryRequest,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理瞬态错误请求,并在配置次数内模拟失败。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestTransientErrorRequestHandler : IRequestHandler<TestTransientErrorRequest, string>
|
public sealed class TestTransientErrorRequestHandler : IRequestHandler<TestTransientErrorRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public ValueTask<string> Handle(TestTransientErrorRequest request, CancellationToken cancellationToken)
|
public ValueTask<string> Handle(TestTransientErrorRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// 只有在MaxErrors > 0时才增加计数器
|
// 只有在MaxErrors > 0时才增加计数器
|
||||||
@ -274,8 +312,12 @@ public sealed class TestTransientErrorRequestHandler : IRequestHandler<TestTrans
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理断路器请求,并根据失败阈值切换断路器状态。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestCircuitBreakerRequestHandler : IRequestHandler<TestCircuitBreakerRequest, string>
|
public sealed class TestCircuitBreakerRequestHandler : IRequestHandler<TestCircuitBreakerRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public ValueTask<string> Handle(TestCircuitBreakerRequest request, CancellationToken cancellationToken)
|
public ValueTask<string> Handle(TestCircuitBreakerRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// 检查断路器状态
|
// 检查断路器状态
|
||||||
@ -302,8 +344,12 @@ public sealed class TestCircuitBreakerRequestHandler : IRequestHandler<TestCircu
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理 Saga 步骤请求,并在失败时记录补偿步骤。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestSagaStepRequestHandler : IRequestHandler<TestSagaStepRequest, string>
|
public sealed class TestSagaStepRequestHandler : IRequestHandler<TestSagaStepRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public ValueTask<string> Handle(TestSagaStepRequest request, CancellationToken cancellationToken)
|
public ValueTask<string> Handle(TestSagaStepRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
if (request.ShouldFail && request.Step == 2)
|
if (request.ShouldFail && request.Step == 2)
|
||||||
@ -328,8 +374,12 @@ public sealed class TestSagaStepRequestHandler : IRequestHandler<TestSagaStepReq
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理链式请求,并返回预定义的链路完成结果。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestChainStartRequestHandler : IRequestHandler<TestChainStartRequest, string>
|
public sealed class TestChainStartRequestHandler : IRequestHandler<TestChainStartRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public async ValueTask<string> Handle(TestChainStartRequest request, CancellationToken cancellationToken)
|
public async ValueTask<string> Handle(TestChainStartRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// 模拟链式调用
|
// 模拟链式调用
|
||||||
@ -338,8 +388,12 @@ public sealed class TestChainStartRequestHandler : IRequestHandler<TestChainStar
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理外部服务请求,并通过延时模拟超时场景。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestExternalServiceRequestHandler : IRequestHandler<TestExternalServiceRequest, string>
|
public sealed class TestExternalServiceRequestHandler : IRequestHandler<TestExternalServiceRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public async ValueTask<string> Handle(TestExternalServiceRequest request, CancellationToken cancellationToken)
|
public async ValueTask<string> Handle(TestExternalServiceRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await Task.Delay(request.TimeoutMs, cancellationToken).ConfigureAwait(false);
|
await Task.Delay(request.TimeoutMs, cancellationToken).ConfigureAwait(false);
|
||||||
@ -348,8 +402,12 @@ public sealed class TestExternalServiceRequestHandler : IRequestHandler<TestExte
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理数据库请求,并把输入数据写入模拟存储集合。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestDatabaseRequestHandler : IRequestHandler<TestDatabaseRequest, string>
|
public sealed class TestDatabaseRequestHandler : IRequestHandler<TestDatabaseRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public ValueTask<string> Handle(TestDatabaseRequest request, CancellationToken cancellationToken)
|
public ValueTask<string> Handle(TestDatabaseRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
request.Storage.Add(request.Data);
|
request.Storage.Add(request.Data);
|
||||||
@ -357,26 +415,46 @@ public sealed class TestDatabaseRequestHandler : IRequestHandler<TestDatabaseReq
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示用于简单行为验证的测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestBehaviorRequest : IRequest<string>
|
public sealed record TestBehaviorRequest : IRequest<string>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化要原样返回的消息内容。
|
||||||
|
/// </summary>
|
||||||
public string Message { get; init; } = string.Empty;
|
public string Message { get; init; } = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理简单行为请求,并回显请求消息。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestBehaviorRequestHandler : IRequestHandler<TestBehaviorRequest, string>
|
public sealed class TestBehaviorRequestHandler : IRequestHandler<TestBehaviorRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public ValueTask<string> Handle(TestBehaviorRequest request, CancellationToken cancellationToken)
|
public ValueTask<string> Handle(TestBehaviorRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
return new ValueTask<string>(request.Message);
|
return new ValueTask<string>(request.Message);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示带输入校验约束的测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestValidatedRequest : IRequest<string>
|
public sealed record TestValidatedRequest : IRequest<string>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化要验证的整数值。
|
||||||
|
/// </summary>
|
||||||
public int Value { get; init; }
|
public int Value { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理带校验的请求,并在输入无效时抛出异常。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestValidatedRequestHandler : IRequestHandler<TestValidatedRequest, string>
|
public sealed class TestValidatedRequestHandler : IRequestHandler<TestValidatedRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public ValueTask<string> Handle(TestValidatedRequest request, CancellationToken cancellationToken)
|
public ValueTask<string> Handle(TestValidatedRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// 验证输入
|
// 验证输入
|
||||||
@ -389,25 +467,50 @@ public sealed class TestValidatedRequestHandler : IRequestHandler<TestValidatedR
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示需要在若干次失败后才能成功的重试测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestRetryRequest : IRequest<string>
|
public sealed record TestRetryRequest : IRequest<string>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化在返回成功前应模拟的失败次数。
|
||||||
|
/// </summary>
|
||||||
public int ShouldFailTimes { get; init; }
|
public int ShouldFailTimes { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 保存重试测试的共享计数状态。
|
||||||
|
/// </summary>
|
||||||
public static class TestRetryBehavior
|
public static class TestRetryBehavior
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或设置当前请求处理期间累计的尝试次数。
|
||||||
|
/// </summary>
|
||||||
public static int AttemptCount { get; set; }
|
public static int AttemptCount { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
// 性能测试相关类
|
/// <summary>
|
||||||
|
/// 表示用于并发与性能验证的测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestPerformanceRequest : IRequest<int>
|
public sealed record TestPerformanceRequest : IRequest<int>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化请求的标识值。
|
||||||
|
/// </summary>
|
||||||
public int Id { get; init; }
|
public int Id { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化模拟处理延时,单位为毫秒。
|
||||||
|
/// </summary>
|
||||||
public int ProcessingTimeMs { get; init; }
|
public int ProcessingTimeMs { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理性能请求,并在延时后返回请求标识。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestPerformanceRequestHandler : IRequestHandler<TestPerformanceRequest, int>
|
public sealed class TestPerformanceRequestHandler : IRequestHandler<TestPerformanceRequest, int>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public async ValueTask<int> Handle(TestPerformanceRequest request, CancellationToken cancellationToken)
|
public async ValueTask<int> Handle(TestPerformanceRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
await Task.Delay(request.ProcessingTimeMs, cancellationToken).ConfigureAwait(false);
|
await Task.Delay(request.ProcessingTimeMs, cancellationToken).ConfigureAwait(false);
|
||||||
@ -415,13 +518,23 @@ public sealed class TestPerformanceRequestHandler : IRequestHandler<TestPerforma
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示用于内存占用验证的测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestMemoryRequest : IRequest<string>
|
public sealed record TestMemoryRequest : IRequest<string>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化用于模拟负载的数据内容。
|
||||||
|
/// </summary>
|
||||||
public string Data { get; init; } = string.Empty;
|
public string Data { get; init; } = string.Empty;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 处理内存测试请求,并在不保留额外引用的前提下制造短期分配。
|
||||||
|
/// </summary>
|
||||||
public sealed class TestMemoryRequestHandler : IRequestHandler<TestMemoryRequest, string>
|
public sealed class TestMemoryRequestHandler : IRequestHandler<TestMemoryRequest, string>
|
||||||
{
|
{
|
||||||
|
/// <inheritdoc />
|
||||||
public ValueTask<string> Handle(TestMemoryRequest request, CancellationToken cancellationToken)
|
public ValueTask<string> Handle(TestMemoryRequest request, CancellationToken cancellationToken)
|
||||||
{
|
{
|
||||||
// 模拟内存使用
|
// 模拟内存使用
|
||||||
@ -430,25 +543,50 @@ public sealed class TestMemoryRequestHandler : IRequestHandler<TestMemoryRequest
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 错误处理相关类
|
/// <summary>
|
||||||
|
/// 保存瞬态错误测试的共享计数状态。
|
||||||
|
/// </summary>
|
||||||
public static class TestTransientErrorHandler
|
public static class TestTransientErrorHandler
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或设置当前已模拟的错误次数。
|
||||||
|
/// </summary>
|
||||||
public static int ErrorCount { get; set; }
|
public static int ErrorCount { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示用于瞬态错误场景的测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestTransientErrorRequest : IRequest<string>
|
public sealed record TestTransientErrorRequest : IRequest<string>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化允许连续抛出的最大错误次数。
|
||||||
|
/// </summary>
|
||||||
public int MaxErrors { get; init; }
|
public int MaxErrors { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 保存断路器场景的共享测试状态。
|
||||||
|
/// </summary>
|
||||||
public static class TestCircuitBreakerHandler
|
public static class TestCircuitBreakerHandler
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或设置当前累计的失败次数。
|
||||||
|
/// </summary>
|
||||||
public static int FailureCount { get; set; }
|
public static int FailureCount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或设置当前累计的成功次数。
|
||||||
|
/// </summary>
|
||||||
public static int SuccessCount { get; set; }
|
public static int SuccessCount { get; set; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或设置断路器是否已处于打开状态。
|
||||||
|
/// </summary>
|
||||||
public static bool CircuitOpen { get; set; }
|
public static bool CircuitOpen { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 重置断路器测试状态,避免静态字段在测试之间互相污染。
|
/// 重置断路器测试状态,避免静态字段在测试之间互相污染。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public static void Reset()
|
public static void Reset()
|
||||||
{
|
{
|
||||||
@ -458,50 +596,87 @@ public static class TestCircuitBreakerHandler
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示用于断路器场景的测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestCircuitBreakerRequest : IRequest<string>
|
public sealed record TestCircuitBreakerRequest : IRequest<string>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化当前请求是否应主动模拟失败。
|
||||||
|
/// </summary>
|
||||||
public bool ShouldFail { get; init; }
|
public bool ShouldFail { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
// 复杂场景相关类
|
/// <summary>
|
||||||
|
/// 保存 Saga 执行与补偿过程中的共享状态。
|
||||||
|
/// </summary>
|
||||||
public class SagaData
|
public class SagaData
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取 Saga 已成功执行的步骤集合。
|
/// 获取 Saga 已成功执行的步骤集合。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IList<int> CompletedSteps { get; } = new List<int>();
|
public IList<int> CompletedSteps { get; } = new List<int>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取 Saga 失败后已执行补偿的步骤集合。
|
/// 获取 Saga 失败后已执行补偿的步骤集合。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IList<int> CompensatedSteps { get; } = new List<int>();
|
public IList<int> CompensatedSteps { get; } = new List<int>();
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取或设置 Saga 是否已经完整结束。
|
/// 获取或设置 Saga 是否已经完整结束。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public bool IsCompleted { get; set; }
|
public bool IsCompleted { get; set; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示 Saga 中单个步骤的测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestSagaStepRequest : IRequest<string>
|
public sealed record TestSagaStepRequest : IRequest<string>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化当前要执行的 Saga 步骤编号。
|
||||||
|
/// </summary>
|
||||||
public int Step { get; init; }
|
public int Step { get; init; }
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化当前 Saga 使用的共享状态对象。
|
||||||
|
/// </summary>
|
||||||
public SagaData SagaData { get; init; } = null!;
|
public SagaData SagaData { get; init; } = null!;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化当前步骤是否应模拟失败。
|
||||||
|
/// </summary>
|
||||||
public bool ShouldFail { get; init; }
|
public bool ShouldFail { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示用于链式请求场景的起始请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestChainStartRequest : IRequest<string>;
|
public sealed record TestChainStartRequest : IRequest<string>;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示依赖外部服务响应时间的测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestExternalServiceRequest : IRequest<string>
|
public sealed record TestExternalServiceRequest : IRequest<string>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化模拟外部服务所需的响应时长,单位为毫秒。
|
||||||
|
/// </summary>
|
||||||
public int TimeoutMs { get; init; }
|
public int TimeoutMs { get; init; }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 表示用于模拟数据库写入的测试请求。
|
||||||
|
/// </summary>
|
||||||
public sealed record TestDatabaseRequest : IRequest<string>
|
public sealed record TestDatabaseRequest : IRequest<string>
|
||||||
{
|
{
|
||||||
|
/// <summary>
|
||||||
|
/// 获取或初始化要写入存储集合的数据内容。
|
||||||
|
/// </summary>
|
||||||
public string Data { get; init; } = string.Empty;
|
public string Data { get; init; } = string.Empty;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 获取或初始化用于模拟数据库写入的可变存储集合,同时避免泄漏具体集合实现。
|
/// 获取或初始化用于模拟数据库写入的可变存储集合,同时避免泄漏具体集合实现。
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public IList<string> Storage { get; init; } = new List<string>();
|
public IList<string> Storage { get; init; } = new List<string>();
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user