我们有一些UI集成测试不能在构建服务器上运行,因为启动测试GUI应用程序需要以用户身份运行构建代理(而不是当前设置的服务)。
这会导致构建管道卡住。所以我想在本地运行这些测试,而不是在构建服务器上。
是否有一种方法来实现这使用xUnit或MSTests和Azure DevOps构建管道?
你当然可以。
设置一个环境变量,以指示它是否在构建中的构建服务器上运行。yml文件。
variables:
- name: IsRunningOnBuildServer
value: true
答案1:使用xUnit
现在创建一个自定义事实属性来使用它:
// This is taken from this SO answer: https://stackoverflow.com/a/4421941/8644294
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
这将运行所有不包含" integrationtests"的测试。
您可以在这里阅读更多关于测试过滤的信息:https://learn.microsoft.com/en-us/dotnet/core/testing/selective-unit-tests