NUnit CustomAttribute获取TestName始终为AdHockTestMethod如何修复?
排查点&解决方案
核心排查点
- NUnit版本/适配器版本变更
你之前观察到的多次触发CustomAttribute是旧版NUnit(3.12及更早)的内部行为,NUnit 3.13+、NUnit3TestAdapter 4.0+ 调整了属性的触发时机,现在仅会在测试初始化完成前触发1次属性逻辑,你的过滤逻辑把唯一的一次触发直接忽略,自然拿不到后续的正确测试名。你可以回滚到之前正常运行的NUnit/适配器版本验证该问题。 - 属性取值时机错误
如果你是在CustomAttribute的构造函数中直接获取TestContext.CurrentContext.Test.Name,此时测试实例还未完成初始化,拿到的必然是NUnit内部占位值AdHocTestMethod。正确的做法是让CustomAttribute实现ITestAction接口,在BeforeTest(ITest test)方法中通过test.Name直接取测试名,不需要依赖TestContext,也不会拿到占位值。
示例代码:public class CustomAttribute : Attribute, ITestAction { public void BeforeTest(ITest test) { // 直接取test.Name即可,不会出现AdHocTestMethod var testName = test.Name; // 你的自定义逻辑 } public void AfterTest(ITest test) { // 测试后逻辑 } public ActionTargets Targets => ActionTargets.Test; } - 异步上下文丢失
你的测试方法是异步实现,如果基类BaseClass中的初始化逻辑用了ConfigureAwait(false),或者你在属性逻辑中使用了未等待的异步操作,会导致TestContext的AsyncLocal上下文流动中断,拿到默认的占位值。检查所有异步逻辑是否都加了await,且没有随意丢弃上下文。 - 测试运行环境变更
如果你近期更换了测试运行方式(比如从VS测试探索者切换为dotnet test命令行、CI环境更换了运行器版本),不同运行器对TestContext的初始化时机存在差异,也会导致该问题。可以用同一运行器在旧版本分支上运行测试做对比验证。 - 过滤逻辑异常
检查你写的AdHocTestMethod过滤逻辑是否存在拼写错误(注意你描述里曾出现AdHockTestMethod多写一个c的拼写问题),如果过滤条件匹配错误,会导致你一直误判取值结果。
临时解决方案
如果暂时不想调整属性实现,可以先移除AdHocTestMethod的过滤逻辑,直接在测试方法内部首次执行自定义逻辑时再取TestContext.CurrentContext.Test.Name,此时测试已经完全初始化,必然能拿到正确的测试名。
内容的提问来源于stack exchange,提问作者Cielo Vista Software
相关产品推荐
相关产品推荐

