【问题标题】:How do you run Integration test to GRPC Client and Server together?您如何同时运行对 GRPC 客户端和服务器的集成测试?
【发布时间】:2022-11-02 05:25:06
【问题描述】:

我有一个Asp.net Core 6 Web api。

我有一个GRPC 客户端,它调用一个GRPC 服务器,我想用xUnit 执行一个集成测试,这两个都涉及。

我希望客户端调用服务器并返回响应并对响应做出断言。

我看到了 MSDN 示例 here,我在 Stackoverflow here 上看到了这个答案。

基于这两个示例,我提出了以下测试类:

public class ItemsTests : IClassFixture<CustomWebApplicationFactory<FirstProject.Program>>,
                           IClassFixture<CustomWebApplicationFactory<SecondProject.Program>>
{

    private readonly HttpClient _firstProjectClient;

    public ItemsTests(CustomWebApplicationFactory<FirstProject.Program> firstFactory,
                       CustomWebApplicationFactory<SecondProject.Program> secondFactory)
    {
         var secondProjectClient = = secondFactory.CreateClient();
         var grpcChannel = GrpcChannel.ForAddress(secondProjectClient.BaseAddress, new 
         GrpcChannelOptions() 
         {
             HttpClient = secondProjectClient;
         });

         var grpcClient = new ItemsServiceClient(grpcChannel);

         var mockGrpcClientFactory = new Mock<GrpcClientFactory>();
         
         mockGrpcClientFactory
              .SetUp(x=>x.CreateClient<ItemsServiceClient>(It.IsAny<string>())
              .Returns(grpcClient);

        _firstProjectClient = firstFactory
                           .WithWebHostBuilder(builder =>
                           {
                                builder.ConfigureTestServices(services =>
                                {
                                    services.AddTransient(x => mockGrpcClientFactory);
                                });
                           })
                           .CreateClient(new WebApplicationFactoryClientOptions
                           {
                               AllowAutoRedirect = false
                           });

    }
}

[Fact]
public void FirstTest()
{
   //Act 
   var reponse = await _firstProjectClient.GetAsync("/Items");

}

上面的代码有效。它确实一直到第二个项目并返回信息。我的问题是:它是最优的吗?有没有人看到这个实现有任何缺陷?

【问题讨论】:

  • 恕我直言,这种级别的集成应该通过端到端测试来测试,而不是集成。在集成测试中,您应该模拟外部依赖项,换句话说,在测试项目 A 时,模拟项目 B 的响应。

标签: c# asp.net-core integration-testing


【解决方案1】:

集成测试在比单元测试更广泛的层面上评估应用程序的组件。 gRPC 应用托管在 Microsoft.AspNetCore.TestHost 包中的内存测试服务器 TestServer 中。

单元测试库启动 gRPC 应用程序,然后使用 gRPC 客户端测试 gRPC 服务。

示例代码包含使集成测试成为可能的基础设施:

  • GrpcTestFixture 类配置 ASP.NET Core 主机并在内存测试服务器中启动 gRPC 应用程序。
  • IntegrationTestBase 类是集成测试继承自的基本类型。它包含夹具状态和用于创建 gRPC 客户端以调用 gRPC 应用程序的 API。

见:AspNetCore.Docs/aspnetcore/grpc/test-services/sample/Tests/Server/IntegrationTests/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 1970-01-01
    • 2013-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多