.NET中为OpenTelemetry追踪添加自定义属性的单元测试方案
单元测试MassTransit过滤器中OpenTelemetry标签设置的解决方案
要解决测试中Activity.Current为空的问题,核心是在单元测试上下文里手动模拟分布式追踪的Activity环境,具体实现如下:
1. 配置测试用的Activity监听
在测试类的初始化方法中,注册一个ActivityListener,确保测试环境能捕获并处理Activity:
[TestInitialize] public void Setup() { ActivitySource.AddActivityListener(new ActivityListener { ShouldListenTo = source => source.Name == "你的项目ActivitySource名称", Sample = (ref ActivityCreationOptions<ActivityContext>) => ActivitySamplingResult.AllData, }); }
2. 手动创建并激活Activity上下文
在测试方法里,先启动一个Activity,让Activity.Current有值,再执行你的过滤器逻辑:
[TestMethod] public async Task CustomFilter_Adds_Expected_Tag_To_Activity() { // 启动测试用Activity using var testActivity = new Activity("Test-MassTransit-Consume").Start(); // 模拟MassTransit消费上下文(根据你的过滤器依赖构造对应实例) var mockContext = new Mock<ConsumeContext<YourMessageType>>(); // 按需设置mockContext的必要属性,比如Message等 // 实例化过滤器并执行 var filter = new YourCustomMtFilter(); await filter.Send(mockContext.Object, () => Task.CompletedTask); // 验证标签是否正确添加 Assert.IsTrue(testActivity.Tags.ContainsKey("bf.my_attribute")); Assert.AreEqual("myAttributeValue", testActivity.Tags["bf.my_attribute"]); }
3. 简化MassTransit上下文模拟
如果觉得手动Mock上下文太麻烦,可以用MassTransit的TestHarness,它能帮你快速构造测试用的管道和上下文:
[TestMethod] public async Task Filter_Adds_Tag_Using_TestHarness() { using var testActivity = new Activity("Test-Harness").Start(); var harness = new InMemoryTestHarness(); // 注册你的自定义过滤器到管道 harness.Consumer(() => new YourConsumer(), cfg => cfg.AddFilter(new YourCustomMtFilter())); await harness.Start(); try { // 发送测试消息 await harness.InputQueueSendEndpoint.Send(new YourMessageType()); // 等待消息处理完成 await harness.Consumed.Any<YourMessageType>(); // 验证Activity标签 Assert.IsTrue(testActivity.Tags.ContainsKey("bf.my_attribute")); } finally { await harness.Stop(); } }
4. 测试后清理
在测试清理方法中确保Activity被正确停止,避免污染其他测试:
[TestCleanup] public void Teardown() { Activity.Current?.Stop(); }
内容的提问来源于stack exchange,提问作者Luca Prodan
相关产品推荐
相关产品推荐

