我不知道这个问题是否适合这个论坛。
我正在开发一个C# ASP.NET核心uses服务和一个使用此uses服务的客户端库。此时,服务器端部分和客户端部分的代码都位于同一个Git存储库和Visual解决方案中。服务器部分打算在Azure中运行。
我有一个单元测试和集成测试的组合,包括同时测试客户机和服务器的端到端集成测试。我已经编写了一些测试,这些测试可以针对Azure中的服务器实例(使用注入的URI )运行客户机(取决于配置),也可以针对使用Microsoft.AspNetCore.TestHost.的本地内存中服务器实例运行。
这个很好用。内存中的服务器实例在编码时非常方便.我们的持续集成(Jenkins)服务器针对云部署的服务器(即部署到Azure的ASP.NET核心the服务的实例)运行集成测试。这种针对云的测试提供了至关重要的价值,但在本地编写代码时太麻烦了。
问题来了:服务器打算在.NET 5上运行。客户端部分需要能够同时在.NET Framework4.8和.NET 5上运行。我们希望测试运行4.8的客户端是否能够在运行.NET 5的服务器(即针对.NET 5编译的ASP.NET核心We服务实例)上正确工作。
当然,使用.NET 4.8对使用.NET 5的云部署服务器运行集成测试是可能的。
在本地运行这些测试可能不可能--或者至少不方便--(因为相同的测试过程必须同时运行.NET 4.8和.NET 5)。但我想我们可以接受的。
当然,我可以使用.NET 5构建服务器部分,并将其部署到服务器上,并对其运行一个集成测试。但这不能解决我的长期问题。我希望能够定期运行我的所有集成测试。更具体地说,我希望达到的目标是:
我可以通过制作一个集成测试项目的副本并让这个新的项目目标.NET 4.8来实现1-3,并且总是在云上运行。但这意味着要维持两组测试。
你对我如何实现所有四个目标有什么建议吗?
提前感谢!
编辑1:关于平台:我们的开发人员机器和Jenkins主机运行。云部署的服务器也运行在Windows上。
编辑2:简单地多目标化测试项目(即让测试项目同时编译.NET 4.8和.NET 5)是不可能的。测试项目对服务器部件有一个引用,因为它需要能够在本地运行服务器。服务器部分需要.NET 5;它不能针对.NET 4.8进行编译(它依赖于.NET 4.8不存在的库)。因此,测试项目也不能针对.NET 4.8进行编译。
发布于 2021-07-05 09:57:40
最后,正如@vernou所建议的那样,我用预处理器指令来解决这个问题。
我有以下项目:
webservice.
我的集成测试CSPROJ包含以下内容:
<PropertyGroup>
<TargetFrameworks>netframework4.8;net5.0</TargetFrameworks>
</PropertyGroup>
<!-- NuGet packages that we always need -->
<ItemGroup>
<PackageReference Include="Xunit.SkippableFact" Version="1.4.13" />
</ItemGroup>
<!-- NuGet packages that require .NET 5 -->
<ItemGroup Condition=" '$(TargetFramework)' == 'net5.0'">
<PackageReference Include="Microsoft.AspNetCore.TestHost" Version="5.0.3" />
</ItemGroup>
<!-- Project references that we always need -->
<ItemGroup>
<ProjectReference Include="ClientLibrary.csproj" />
</ItemGroup>
<!-- Project references that require .NET 5 -->
<ItemGroup Condition=" '$(TargetFramework)' == 'net5.0'">
<ProjectReference Include="WebAPI.csproj" />
</ItemGroup>我的Jenkinsfile将一个环境变量设置为指向云应用程序的Azure部署实例:
def deployed_uri = powershell (
script: "pulumi stack output EndPoint",
returnStdout: true
)
env.integrationtest_service_uri = deployed_uri我的测试是这样的:
private IService CreateService(Uri? uri)
{
if (uri is null)
{
// This is a built-in preprocessor directive: https://learn.microsoft.com/en-us/dotnet/csharp/language-reference/preprocessor-directives
#if NET5_0
_output.WriteLine("Connecting to locally hosted service");
return CreateLocallyHostedService();
#else
throw new JenkinsOnlyIntegrationTestException(
"Cannot start service because URI is null; we will assume that this test is only intended to run on Jenkins");
#endif
}
else
{
_output.WriteLine($"Connecting to service on URI: {uri}");
return CreateServiceAgainstRemoteUri(uri);
}
}
[SkippableFact(typeof(JenkinsOnlyIntegrationTestException))]
public void TestThatServiceWorks(){
var uri = GetUriOrNullFromEnvironmentVariableSetByJenkins()
var service = CreateService(uri);
// Test the service.
}这条路:
如果设置了环境变量integrationtest_service_uri,则集成测试将在该地址对(云托管的)服务器实例运行。如果没有设置环境变量,且框架为.NET 5,则集成测试将使用Microsoft.AspNetCore.TestHost.
https://stackoverflow.com/questions/68207486
复制相似问题