在构建服务器上 运行 时跳过单元测试
Skip unit tests while running on the build server
我们有一些 UI 集成测试不能 运行 在构建服务器上,因为启动测试 GUI 应用需要 运行 将构建代理作为一个用户(而不是当前设置的服务)。
这会导致构建管道卡住。所以我想 运行 在本地而不是在构建服务器上进行这些测试。
有没有办法使用 xUnit 或 MSTests 和 Azure 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
我们有一些 UI 集成测试不能 运行 在构建服务器上,因为启动测试 GUI 应用需要 运行 将构建代理作为一个用户(而不是当前设置的服务)。
这会导致构建管道卡住。所以我想 运行 在本地而不是在构建服务器上进行这些测试。
有没有办法使用 xUnit 或 MSTests 和 Azure 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