【问题标题】:Integration Tests using XUnit.NET - Solution root could not be located using application root使用 XUnit.NET 进行集成测试 - 无法使用应用程序根找到解决方案根
【发布时间】:2021-03-10 07:18:17
【问题描述】:

我在解决方案中有两个项目。

  1. 使用 .NET Core 3.1 的 Web API
  2. 使用 XUnit.NET 和 .NET Core 3.1 进行集成测试,此项目参考了 Web API 项目

这里有一个示例集成测试类。

public class CustomersControllerTests : IClassFixture<WebApplicationFactory<WebAPIProject.Startup>> 
    {
            public CustomersControllerTests(WebApplicationFactory<WebAPIProject.Startup> factory)
            {
                _httpClient = factory.CreateClient();
                _customerRepository = factory.Services.GetService<ICustomerRepository>();            
            }
    }

我使用以下文章开发了集成测试。

https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-3.1

所有测试在 Visual Studio 中运行良好。 因此,集成测试项目被放入 Azure DevOps 管道中。

这是代理作业中的任务。

  1. 下载管道工件任务(从构建管道下载构建工件)
  2. Visual Studio 测试平台来自安装程序任务
  3. Visual Studio 测试任务

所有测试在执行期间都失败了,这里是其中一个测试的堆栈跟踪。

System.InvalidOperationException : Solution root could not be located using application root D:\a\r1\a\_ReleaseManagement.API.IntegrationTests-CI\drop\ReleaseManagement.IntegrationTests\Release\.
[xUnit.net 00:00:06.59]       Stack Trace:
at Microsoft.AspNetCore.TestHost.WebHostBuilderExtensions.UseSolutionRelativeContentRoot(IWebHostBuilder builder, String solutionRelativePath, String applicationBasePath, String solutionName)
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.SetContentRoot(IWebHostBuilder builder)
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.<EnsureServer>b__20_0(IWebHostBuilder webHostBuilder)
at Microsoft.Extensions.Hosting.GenericHostWebHostBuilderExtensions.ConfigureWebHost(IHostBuilder builder, Action`1 configure)
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.EnsureServer()
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateDefaultClient(DelegatingHandler[] handlers)
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateDefaultClient(Uri baseAddress, DelegatingHandler[] handlers)
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateClient(WebApplicationFactoryClientOptions options)
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateClient()
/home/vsts/work/1/s/src/UnitTests/ReleaseManagement.IntegrationTests/Api/CustomersControllerTests.cs(29,0): at ReleaseManagement.IntegrationTests.Api.CustomersControllerTests..ctor(WebApplicationFactory`1 factory)
2020-11-27T09:54:43.4381123Z ##[error][xUnit.net 00:00:06.59]     ReleaseManagement.IntegrationTests.Api.CustomersControllerTests.CreateCustomer_Success [FAIL]

构建管道定义 -

steps:
 - task: UseDotNet@2
   displayName: "Use .NET Core SDK $(netCoreVersion)"
   inputs:
    version: $(netCoreVersion)


 - task: DotNetCoreCLI@2
   displayName: 'Restore project dependencies'
   inputs:
    command: 'restore'
    projects: '**/ABC.IntegrationTests/ABC.IntegrationTests.csproj'


 - task: DotNetCoreCLI@2
   displayName: 'Build API Integration Tests - $(buildConfiguration)'
   inputs:
    command: 'build'
    arguments: '--configuration $(buildConfiguration) --no-restore --output $(Build.ArtifactStagingDirectory)\ABC.IntegrationTests\Release'
    projects: '**/ABC.IntegrationTests/ABC.IntegrationTests.csproj'


 - task: PublishBuildArtifacts@1
   displayName: 'Publish build artifact: drop'
   condition: succeeded()

发布管道定义-

steps:
- task: DotNetCoreCLI@2
  displayName: 'dotnet test'
  inputs:
    command: test
    arguments: '_ABC.API.IntegrationTests-CI\drop\ABC.IntegrationTests\Release\ABC.IntegrationTests.dll'

有关如何解决此问题以便可以在 azure devops 管道中执行测试的任何帮助?

【问题讨论】:

  • 您能否更新您的问题并添加构建和集成管道定义?
  • 更新了构建和发布定义,谢谢。
  • 嗨@Bhanu。这张票有更新吗?如果答案能给你一些帮助,请随时告诉我。只是提醒this

标签: asp.net-core azure-devops asp.net-core-mvc integration-testing xunit.net


【解决方案1】:

基本上“WebApplicationFactory”需要“WebApplicationFactoryContentRootAttribute”才能找到根,所以请阅读更多here

试试这个fix 或者这个one

【讨论】:

    【解决方案2】:

    根据错误日志,在dotnet test的过程中,需要参考build的源文件。但是当它在机器上不存在时,它会失败。

    /home/vsts/work/1/s/src/UnitTests/ReleaseManagement.IntegrationTests/Api/CustomersControllerTests.cs(29,0):在 ReleaseManagement.IntegrationTests.Api.CustomersControllerTests..ctor(WebApplicationFactory`1 工厂)

    要解决此问题,您可以尝试以下方法:

    1.在相同构建管道中集成构建和测试。

    1. 如果您想在不同的管道中拆分构建和测试,您需要注意以下几点。
    • 您需要确保构建和发布管道使用相同 Microsoft 托管的代理。 (根据您的日志,他们使用的是不同类型的代理)

    • 您需要在发布管道中添加 repo 源。然后在 Release 管道中添加复制文件任务和 dotnet restore 任务。

    发布工件:

    发布任务

    说明:

    复制文件任务用于将文件源复制到构建代理源目录路径。您可以查看发布错误日志中的具体路径。

    例如:构建源路径:D:\a\1\sRelease Pipeline 将文件复制到D:\a\1\s

    dotnet restore 任务用于恢复源文件所需的包。在 dotnet 测试中,它可能需要一些包。

    3.您可以创建一个Self-hosted agent。然后您可以直接在自托管代理上运行构建和测试,无需其他设置。

    【讨论】:

      【解决方案3】:

      我已进行以下更改以解决已发布的问题。

      1. 将 MainSolution.sln 文件复制到 Release 构建/发布文件夹
      2. 如下创建了一个 CustomWebApplicationRepository

      公共类 CustomWebApplicationFactory : WebApplicationFactory {

      protected override void ConfigureWebHost(IWebHostBuilder builder)
      {
          builder.UseContentRoot(AppContext.BaseDirectory);
          base.ConfigureWebHost(builder);
          
      }
      

      }

      1. 在集成测试中使用 CustomWebApplicationFactory。

        公共类CustomersControllerTests:IClassFixture { 公共客户控制器测试(CustomWebApplicationFactory 工厂) { _httpClient = factory.CreateClient(); _customerRepository = factory.Services.GetService();
        } }

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-28
        • 2019-01-22
        • 2022-06-14
        • 1970-01-01
        相关资源
        最近更新 更多