You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在运行时获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.02 09:24:03