如何为MSTest实现自定义[TestWithCheats]特性?(RELEASE模式跳过测试)
解决MSTest中[TestWithCheats]特性在RELEASE配置下跳过测试且不判定失败的问题
你遇到的核心问题是Assert.Inconclusive在Jenkins的测试运行器中会被判定为失败,而非预期的“跳过”状态。要实现RELEASE配置下跳过测试、DEBUG配置下强制执行的需求,更可靠的方式是自定义特性,直接基于编译配置控制测试的执行状态。
自定义TestWithCheats特性
通过条件编译让特性在不同配置下继承不同的基类:
- DEBUG配置(定义
ALLOW_CHEATS):特性继承自TestAttribute,测试正常执行 - RELEASE配置(未定义
ALLOW_CHEATS):特性继承自IgnoreAttribute,测试被标记为跳过,不会触发失败
代码实现:
#if ALLOW_CHEATS using Microsoft.VisualStudio.TestTools.UnitTesting; public class TestWithCheatsAttribute : TestAttribute { } #else using Microsoft.VisualStudio.TestTools.UnitTesting; public class TestWithCheatsAttribute : IgnoreAttribute { public TestWithCheatsAttribute() : base("Skipping cheat tests in Release mode.") { } } #endif
配置编译符号
确保你的项目在DEBUG配置中定义了ALLOW_CHEATS:
- 右键项目 → 属性 → 生成
- 选择“Debug”配置
- 在“条件编译符号”中添加
ALLOW_CHEATS(多个符号用分号分隔)
使用特性标记测试方法
直接给需要控制的测试方法添加[TestWithCheats]特性即可:
[TestClass] public class CheatTests { [TestWithCheats] public void TriggerFreeSpinsRejectCashout() { // 你的测试逻辑代码 } }
方案优势
- 无需在测试方法中添加额外的Helper调用代码,代码更简洁
- 利用MSTest原生的
IgnoreAttribute标记跳过,测试运行器(包括Jenkins)会正确识别为“跳过”而非“失败” - 完全通过编译配置自动切换行为,无需手动修改测试逻辑
内容的提问来源于stack exchange,提问作者Terentiy Gatsukov
相关产品推荐
相关产品推荐

