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

如何在C#中仅在特定操作系统上运行指定单元测试?

问题1:这类操作系统判断字段是否需要编写单元测试

分两种场景判断:

  • 如果该类是项目公共基础组件,有大量上层业务/工具逻辑依赖这几个属性的返回结果,强烈建议编写单元测试,可以有效避免后续代码维护时有人误改属性逻辑(比如写错OSPlatform枚举值)导致上层逻辑大面积出错。
  • 如果该类仅为单次业务场景临时编写、后续不会迭代修改,可以不用额外写测试,毕竟本质是对RuntimeInformation官方API的薄封装,官方API本身已经做过完备测试。
问题2:如何实现仅在特定操作系统运行对应单元测试

你使用的是xUnit测试框架,有两种常用实现方案:

方案1:使用条件跳过能力在测试方法内判断

如果系统专属测试数量不多,可以直接在测试方法入口先校验当前运行系统,不符合要求就直接跳过测试:

using Xunit;
using Xunit.SkippableFact;
using System.Runtime.InteropServices;

public sealed class RuntimeHelperTests
{
    [Fact]
    public void Windows_System_Returns_Correct_Values()
    {
        Skip.IfNot(RuntimeInformation.IsOSPlatform(OSPlatform.Windows), "仅在Windows系统下运行");
        Assert.True(RuntimeHelper.IsWindows);
        Assert.False(RuntimeHelper.IsLinux);
        Assert.False(RuntimeHelper.IsMac);
    }

    [Fact]
    public void Linux_System_Returns_Correct_Values()
    {
        Skip.IfNot(RuntimeInformation.IsOSPlatform(OSPlatform.Linux), "仅在Linux系统下运行");
        Assert.True(RuntimeHelper.IsLinux);
        Assert.False(RuntimeHelper.IsWindows);
        Assert.False(RuntimeHelper.IsMac);
    }

    [Fact]
    public void Mac_System_Returns_Correct_Values()
    {
        Skip.IfNot(RuntimeInformation.IsOSPlatform(OSPlatform.OSX), "仅在Mac系统下运行");
        Assert.True(RuntimeHelper.IsMac);
        Assert.False(RuntimeHelper.IsWindows);
        Assert.False(RuntimeHelper.IsLinux);
    }
}

注:使用Skip方法需要引入xUnit的Xunit.SkippableFactNuGet包。

方案2:自定义操作系统专属Fact特性

如果这类系统专属测试很多,可以封装自定义特性,使用更简洁,且无需引入第三方包:

using Xunit;
using System.Runtime.InteropServices;

[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class FactForOsAttribute : FactAttribute
{
    public FactForOsAttribute(params OSPlatform[] targetOs)
    {
        if (!targetOs.Any(RuntimeInformation.IsOSPlatform))
        {
            Skip = $"仅在以下系统运行:{string.Join(",", targetOs.Select(o => o.ToString()))}";
        }
    }
}

使用时直接给测试方法加特性即可:

public sealed class RuntimeHelperTests
{
    [FactForOs(OSPlatform.Windows)]
    public void Windows_System_Returns_Correct_Values()
    {
        Assert.True(RuntimeHelper.IsWindows);
        Assert.False(RuntimeHelper.IsLinux);
        Assert.False(RuntimeHelper.IsMac);
    }

    [FactForOs(OSPlatform.Linux)]
    public void Linux_System_Returns_Correct_Values()
    {
        Assert.True(RuntimeHelper.IsLinux);
        Assert.False(RuntimeHelper.IsWindows);
        Assert.False(RuntimeHelper.IsMac);
    }

    [FactForOs(OSPlatform.OSX)]
    public void Mac_System_Returns_Correct_Values()
    {
        Assert.True(RuntimeHelper.IsMac);
        Assert.False(RuntimeHelper.IsWindows);
        Assert.False(RuntimeHelper.IsLinux);
    }
}

内容的提问来源于stack exchange,提问作者user13755987

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 08:24:01