在构建服务器上 运行 时跳过单元测试

Skip unit tests while running on the build server

我们有一些 UI 集成测试不能 运行 在构建服务器上,因为启动测试 GUI 应用需要 运行 将构建代理作为一个用户(而不是当前设置的服务)。

这会导致构建管道卡住。所以我想 运行 在本地而不是在构建服务器上进行这些测试。

有没有办法使用 xUnitMSTestsAzure DevOps 构建来实现此目的管道?

你当然可以。

设置环境变量以指示它是否在 build.yml 文件中的构建服务器上 运行。

variables:
- name: IsRunningOnBuildServer
  value: true

答案 1:使用 xUnit

现在创建一个自定义事实属性来使用它:

// This is taken from this SO answer: 
public class IgnoreOnBuildServerFactAttribute : FactAttribute
{
    public IgnoreOnBuildServerFactAttribute()
    {
        if (IsRunningOnBuildServer())
        {
            Skip = "This integration test is skipped running in the build server as it involves launching an UI which requires build agents to be run as non-service. Run it locally!";
        }
    }
    /// <summary>
    /// Determine if the test is running on build server
    /// </summary>
    /// <returns>True if being executed in Build server, false otherwise.</returns>
    public static bool IsRunningOnBuildServer()
    {
        return bool.TryParse(Environment.GetEnvironmentVariable("IsRunningOnBuildServer"), out var buildServerFlag) ? buildServerFlag : false;
    }
}

现在在构建服务器上要跳过 运行 的测试方法上使用此 FactAttribute。例如:

[IgnoreOnBuildServerFact]
public async Task Can_Identify_Some_Behavior_Async()
{
   // Your test code...
}

答案 2:使用 MSTests

创建自定义测试方法属性以覆盖 Execute 方法:

public class SkipTestOnBuildServerAttribute : TestMethodAttribute
{
    public override TestResult[] Execute(ITestMethod testMethod)
    {
        if (!IsRunningOnBuildServer())
        {
            return base.Execute(testMethod);
        }
        else
        {
            return new TestResult[] { new TestResult { Outcome = UnitTestOutcome.Inconclusive } };
        }
    }

    public static bool IsRunningOnBuildServer()
    {
        return bool.TryParse(Environment.GetEnvironmentVariable("IsRunningOnBuildServer"), out var buildServerFlag) ? buildServerFlag : false;
    }
}

现在在构建服务器上要跳过 运行 的测试方法上使用此 TestMethodAttribute。例如:

[SkipTestOnBuildServer]
public async Task Can_Identify_Some_Behavior_Async()
{
   // Your test code...
}

您可以根据名称空间等过滤掉测试

dotnet test --filter FullyQualifiedName!~IntegrationTests

这将 运行 所有在其命名空间中不包含“IntetegrationTests”的测试。

您可以在此处阅读有关测试过滤的更多信息:https://docs.microsoft.com/en-us/dotnet/core/testing/selective-unit-tests