如何在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
相关产品推荐
相关产品推荐

