如何使用xUnit/MSTest在Azure DevOps构建服务器跳过UI集成测试
需求实现方案
该需求完全可以通过测试框架特性配合Azure DevOps管道配置实现,具体操作如下:
一、MSTest适配方案
- 给需要仅本地执行的UI测试类或方法添加
[TestCategory("LocalOnly")]标记,示例代码:
[TestClass] [TestCategory("LocalOnly")] public class GuiIntegrationTests { [TestMethod] public void GuiAppStartTest() { // UI测试逻辑 } }
- 本地执行测试时无需额外配置,所有测试正常运行;Azure DevOps管道执行测试时,添加过滤参数排除该分类的测试即可,过滤指令为
--filter "TestCategory!=LocalOnly"。
二、xUnit适配方案
xUnit没有内置的分类特性,需要先自定义专属标记:
- 第一步:定义
LocalOnly标记特性
public class LocalOnlyAttribute : TraitAttribute { public LocalOnlyAttribute() : base("Category", "LocalOnly") { } }
- 第二步:给目标UI测试添加标记,可标注在方法或类上:
// 标注在方法上 public class GuiIntegrationTests { [Fact, LocalOnly] public void GuiAppStartTest() { // UI测试逻辑 } } // 标注在类上,整个类的测试都会生效 [LocalOnly] public class GuiIntegrationTests { [Fact] public void GuiAppStartTest() { } }
- 管道侧过滤指令和MSTest一致:
--filter "Category!=LocalOnly"。
三、Azure DevOps管道配置
在管道的测试任务中添加上述过滤参数即可,以DotNetCoreCLI@2任务为例,YAML配置参考:
- task: DotNetCoreCLI@2 displayName: 'Execute non-UI tests' inputs: command: 'test' projects: '**/*Test.csproj' arguments: '--configuration Release --filter "Category!=LocalOnly"'
可选兜底方案
如果担心管道配置遗漏过滤参数,可以在测试代码中直接通过环境变量判断执行环境,自动跳过管道中的UI测试。以自定义xUnit Fact特性为例:
public class LocalOnlyFactAttribute : FactAttribute { public LocalOnlyFactAttribute() { // Azure DevOps管道内置的环境变量,存在即说明当前在管道环境运行 if (!string.IsNullOrEmpty(Environment.GetEnvironmentVariable("TF_BUILD"))) { Skip = "UI测试仅允许本地执行,自动跳过管道运行"; } } }
后续给UI测试直接替换[Fact]为[LocalOnlyFact]即可,无需修改管道配置。
内容的提问来源于stack exchange,提问作者Ash K
相关产品推荐
相关产品推荐

