Warm tip: This article is reproduced from serverfault.com, please click

Integration Tests using XUnit.NET

发布于 2020-11-27 13:50:37

I have two projects in the solution.

  1. Web API using .NET Core 3.1
  2. Integration Tests using XUnit.NET and .NET Core 3.1, this project has a reference to Web API project

A sample integration test class is here.

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

I developed the integration tests using the following article.

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

All tests ran fine in Visual Studio. So the integration tests project is put into a Azure DevOps pipeline.

Here are the tasks in the Agent job.

  1. Download Pipeline Artifacts task (to download the build artifacts from build pipeline)
  2. Visual Studio test platfrom installer task
  3. Visual Studio Test task

All tests are failed during execution and here is the stack trace for one of the tests.

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]

Build pipeline definition -

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()

Release pipeline definition -

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

Any help on how to resolve this issue so the tests can be executed in azure devops pipeline?

Questioner
Bhanu
Viewed
0
Bhanu 2020-12-03 17:25:05

I have made the following changes to resolve the posted issues.

  1. Copy the MainSolution.sln file to the Release build / publish folder
  2. Created a CustomWebApplicationRepository as below

public class CustomWebApplicationFactory : WebApplicationFactory<WebAPIProject.Startup> {

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

}

  1. Use the CustomWebApplicationFactory in the integration tests.

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