如何配置xUnit实现负载测试仅在指定条件下执行
xUnit 负载测试条件执行实现方案(无需条件编译)
完全可以通过xUnit原生特性实现需求,不需要额外的条件编译配置,以下是两种可落地的实现方案:
方案一:环境变量自动判断(无需修改IDE配置,更推荐)
利用构建服务器默认存在的CI环境变量,配合自定义测试特性实现自动判断:
- 首先定义负载测试专属的Fact特性:
public class LoadTestFactAttribute : FactAttribute { public LoadTestFactAttribute() { // 主流构建服务器都会预置值为true的CI环境变量 bool isBuildServer = Environment.GetEnvironmentVariable("CI")?.Equals("true", StringComparison.OrdinalIgnoreCase) ?? false; // 非构建服务器环境下默认标记跳过 if (!isBuildServer) { Skip = "负载测试默认仅在构建服务器执行,手动显式触发可忽略该限制"; } } }
如果是用Theory的负载测试,可以对应封装LoadTestTheoryAttribute。
2. 替换负载测试的特性标记:
public class MyLoadTests { [LoadTestFact] public void HighConcurrencyAccessTest() { // 负载测试逻辑 } }
该方案天然满足所有需求:
- 构建服务器存在CI环境变量,不会跳过负载测试,始终执行
- 本地点击「运行全部测试」时,xUnit会自动跳过所有带Skip标记的负载测试
- 本地手动选中单个/多个负载测试触发运行时,IDE测试运行器会自动忽略Skip属性,直接执行测试
方案二:Trait标记+过滤器配置
适合需要灵活调整测试运行范围的场景:
- 定义负载测试的Trait标记:
public class LoadTestAttribute : TraitAttribute { public LoadTestAttribute() : base("TestCategory", "LoadTest") {} }
- 给所有负载测试加该标记:
[LoadTest] public class MyLoadTests { [Fact] public void HighConcurrencyAccessTest() { // 负载测试逻辑 } }
- 配置本地IDE默认测试过滤器:在Visual Studio/Rider的测试设置中,新增默认过滤规则
TestCategory!=LoadTest,点击「运行全部测试」时会自动排除负载测试。 - 配置构建服务器的测试运行命令:执行
dotnet test时不需要加任何过滤参数,或者显式指定包含所有测试即可,例如:
dotnet test --filter "TestCategory=LoadTest|TestCategory!=LoadTest"
- 本地手动执行负载测试时,直接在测试运行器中选中
LoadTest分类下的测试,或者临时清空默认过滤器运行全部测试即可。
内容的提问来源于stack exchange,提问作者mu88
相关产品推荐
相关产品推荐

