首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何以开发人员友好的方式测试在.NET 5.0服务器上运行的.NET 4.8客户端?

如何以开发人员友好的方式测试在.NET 5.0服务器上运行的.NET 4.8客户端?
EN

Stack Overflow用户
提问于 2021-07-01 09:13:16
回答 1查看 504关注 0票数 1

我不知道这个问题是否适合这个论坛。

我正在开发一个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构建服务器部分,并将其部署到服务器上,并对其运行一个集成测试。但这不能解决我的长期问题。我希望能够定期运行我的所有集成测试。更具体地说,我希望达到的目标是:

  1. 使用.NET 5客户端在本地托管的.NET 5服务器上运行集成测试应该很容易(就像今天一样)。詹金斯服务器的
  2. 应该在云部署的.NET 5服务器上运行与.NET 5客户端的集成测试(就像现在一样)。詹金斯服务器
  3. 也应该针对云部署的.NET 5服务器运行带有.NET 4.8客户端的集成测试。
  4. 我不想维护两组测试。我希望在所有3种情况下都能轻松地运行所有相同的测试。

我可以通过制作一个集成测试项目的副本并让这个新的项目目标.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进行编译。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-07-05 09:57:40

最后,正如@vernou所建议的那样,我用预处理器指令来解决这个问题。

我有以下项目:

webservice.

  • WebAPI

  • ClientLibrary--一个调用webservice.

  • IntegrationTest -集成测试的服务器端实现的包装器.

我的集成测试CSPROJ包含以下内容:

代码语言:javascript
复制
  <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部署实例:

代码语言:javascript
复制
def deployed_uri = powershell (
    script: "pulumi stack output EndPoint",
    returnStdout: true
)
env.integrationtest_service_uri = deployed_uri

我的测试是这样的:

代码语言:javascript
复制
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.

  • If对本地宿主服务器运行--环境变量未设置,框架为.NET 4.8,测试将引发异常,但由于测试标记为SkippableFact,。它将被视为跳过而不是失败。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68207486

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档