项目作者: dimitrietataru

项目描述 :
.NET - Unit Testing
高级语言: C#
项目地址: git://github.com/dimitrietataru/csharp-unit-testing.git
创建时间: 2020-02-04T10:59:59Z
项目社区:https://github.com/dimitrietataru/csharp-unit-testing

开源协议:MIT License

下载


C# Unit Testing

Coverage

Table of contents

NuGet packages

  1. PM> Install-Package Bogus -Version 32.0.2
  2. PM> Install-Package coverlet.collector -Version 1.3.0
  3. PM> Install-Package FluentAssertions -Version 5.10.3
  4. PM> Install-Package Microsoft.NET.Test.Sdk -Version 16.8.3
  5. PM> Install-Package Moq -Version 4.15.2
  6. PM> Install-Package ReportGenerator -Version 4.8.1
  7. PM> Install-Package Shouldly -Version 4.0.1
  8. # NUnit
  9. PM> Install-Package NUnit -Version 3.12.0
  10. PM> Install-Package NUnit3TestAdapter -Version 3.17.0
  11. # xUnit
  12. PM> Install-Package xunit -Version 2.4.1
  13. PM> Install-Package xunit.runner.visualstudio -Version 2.4.3

Syntax

Given-When-Then pattern

Martin Fowler’s blog

Arrange-Act-Assert pattern

Docs.Microsoft

Moq setup and verify

  1. // Setup async method when it returns data
  2. mockService
  3. .Setup(_ => _.GetAsync(It.IsAny<int>()))
  4. .ReturnsAsync(It.IsAny<Data>())
  5. .Verifiable();
  6. // Setup async method when it executes without a return type
  7. mockService
  8. .Setup(_ => _.RunAsync())
  9. .ReturnsAsync(Task.CompletedTask)
  10. .Verifiable();
  11. // Setup async method when it throws an exception
  12. mockService
  13. .Setup(_ => _.RunAsync(It.IsAny<int>()))
  14. .Throws<Exception>()
  15. .Verifiable();
  16. // Verify all service methods, marked as 'Verifiable'
  17. mockService.VerifyAll();
  18. // Verify individual service method
  19. mockService.Verify(_ => _.GetAsync(It.IsAny<int>()), Times.Once);
  20. mockService.Verify(_ => _.RunAsync(), Times.Exactly(2));
  21. mockService.Verify(_ => _.RunAsync(It.IsAny<int>()), Times.Never);

Assertions

  1. // NUnit
  2. Assert.That(result, Is.InstanceOf<ObjectResult>());
  3. var apiResponse = result as OkObjectResult;
  4. Assert.That(apiResponse.StatusCode, Is.EqualTo((int)HttpStatusCode.OK));
  5. // xUnit
  6. var apiResponse = Assert.IsType<OkObjectResult>(result);
  7. Assert.Equal((int)HttpStatusCode.OK, apiResponse.StatusCode);
  8. // FluentAssertions
  9. result
  10. .Should().BeOfType<OkObjectResult>("because we return content")
  11. .Which.StatusCode.Should().Be((int)HttpStatusCode.OK);
  12. // Shouldly
  13. result.ShouldSatisfyAllConditions(
  14. () => result.ShouldBeOfType<OkObjectResult>(),
  15. () => (result as OkObjectResult).StatusCode.ShouldBe((int)HttpStatusCode.OK));

Collect code coverage

Install coverlet.collector NuGet package

  1. PM> Install-Package coverlet.collector -Version 1.3.0

TestProject.csproj configuration

  1. <PackageReference Include="coverlet.collector" Version="1.3.0">
  2. <PrivateAssets>all</PrivateAssets>
  3. <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
  4. </PackageReference>

Collector configuration. Add a file (e.g. runsettings) anywhere in the solution/project

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <RunSettings>
  3. <DataCollectionRunSettings>
  4. <DataCollectors>
  5. <DataCollector friendlyName="XPlat code coverage">
  6. <Configuration>
  7. <Format>json,cobertura</Format>
  8. <UseSourceLink>true</UseSourceLink>
  9. <IncludeTestAssembly>false</IncludeTestAssembly>
  10. <ExcludeByFile>**/**/Program.cs,**/**/Startup.cs,**/Dir/SubDir/*.cs</ExcludeByFile>
  11. </Configuration>
  12. </DataCollector>
  13. </DataCollectors>
  14. </DataCollectionRunSettings>
  15. <InProcDataCollectionRunSettings>
  16. <InProcDataCollectors>
  17. <InProcDataCollector
  18. assemblyQualifiedName="Coverlet.Collector.DataCollection.CoverletInProcDataCollector, coverlet.collector, Version=1.3.0.0, Culture=neutral, PublicKeyToken=null"
  19. friendlyName="XPlat Code Coverage"
  20. enabled="True"
  21. codebase="coverlet.collector.dll" ></InProcDataCollector>
  22. </InProcDataCollectors>
  23. </InProcDataCollectionRunSettings>
  24. </RunSettings>

Run tests and collect data

  1. PM> dotnet test --collect:"XPlat Code Coverage" --settings .\runsettings
  2. PM> dotnet test .\Specific.Test.Project --collect:"XPlat Code Coverage" --settings .\Specific.Test.Project\runsettings

Generate Code Coverage Report

Install ReportGenerator NuGet package

  1. PM> Install-Package ReportGenerator -Version 4.8.1

Generate reports

ReportGenerator usage page

  1. PM> dotnet $(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\netcoreapp3.0\ReportGenerator.dll "-reports:coverage.xml" "-targetdir:coveragereport" -reporttypes:Html
  2. PM> dotnet $(UserProfile)\.nuget\packages\reportgenerator\x.y.z\tools\netcoreapp3.0\ReportGenerator.dll "-reports:coverage.xml" "-targetdir:coveragereport" -reporttypes:Badges
  1. # CSharp.UnitTesting.Api NUnit
  2. PM> dotnet $(UserProfile)\.nuget\packages\reportgenerator\4.8.1\tools\netcoreapp3.0\ReportGenerator.dll "-reports:CSharp.UnitTesting.Api.Nunit.Test\TestResults\*\coverage.cobertura.xml" "-targetdir:_CoverageReport\Api\NUnit" "-historydir:_CoverageReport\_History\Api\NUnit" -reporttypes:Html
  3. # CSharp.UnitTesting.Api xUnit
  4. PM> dotnet $(UserProfile)\.nuget\packages\reportgenerator\4.8.1\tools\netcoreapp3.0\ReportGenerator.dll "-reports:CSharp.UnitTesting.Api.Xunit.Test\TestResults\*\coverage.cobertura.xml" "-targetdir:_CoverageReport\Api\xUnit" "-historydir:_CoverageReport\_History\Api\xUnit" -reporttypes:Html