如何在运行时获取NUnit过滤器及nunit-console的where筛选分类列表
运行时获取NUnit筛选分类的实现方案
场景1:单测试用例粒度的初始化判断
如果你只需要在单个测试/测试类执行前判断所属分类,直接用官方公开的TestContext即可:
[SetUp] public void TestInit() { // 读取当前测试的所有分类 var currentCategories = TestContext.Current.Test.Properties["Category"] ?.Cast<string>() .ToList() ?? new List<string>(); // 执行差异化逻辑 if (currentCategories.Contains("IntegrationTest")) { // 初始化数据库连接、外部依赖等 } }
场景2:全局程序集粒度的初始化判断
如果你需要在所有测试执行前(程序集加载阶段)就拿到nunit-console传入的where筛选器指定的全部分类,可以通过反射读取NUnit内部执行上下文参数实现:
using System.Reflection; using System.Text.RegularExpressions; [OneTimeSetUp] public void GlobalInit() { var filterCategories = new List<string>(); try { // 读取NUnit内部执行上下文 var execContextType = Type.GetType("NUnit.Framework.Internal.TestExecutionContext, NUnit.Framework"); var currentContext = execContextType?.GetProperty("CurrentContext", BindingFlags.Public | BindingFlags.Static) ?.GetValue(null); var activeFilter = currentContext?.GetType().GetProperty("TestFilter", BindingFlags.Instance | BindingFlags.Public) ?.GetValue(currentContext); if (activeFilter == null) return; // 解析筛选器字符串提取分类 var filterStr = activeFilter.ToString(); var categoryMatches = Regex.Matches(filterStr, @"cat==\s*""([^""]+)"""); foreach (Match match in categoryMatches) { if (match.Success) filterCategories.Add(match.Groups[1].Value); } } catch { // 版本不兼容时降级为单测试粒度判断即可 } // 执行全局差异化初始化 if (filterCategories.Contains("PerformanceTest")) { // 预热测试环境、关闭日志等性能测试前置操作 } }
注意事项
- 反射实现依赖NUnit内部结构,不同NUnit版本的属性名可能有差异,建议结合你使用的版本调试调整
- 如果where筛选器使用了
cat!=、and、or等复杂逻辑,调整正则规则即可完成解析 - 所有实现仅依赖官方NUnit.Framework包,无需引入额外第三方组件
内容的提问来源于stack exchange,提问作者Siarhei Machel
相关产品推荐
相关产品推荐

