it-swarm.com.de

Wie messen Sie die Codeabdeckung in ASP.NET Core-Projekten in Visual Studio?

Ich möchte die Codeabdeckung meiner XUnit-Tests in einer ASP.NET Core-Anwendung messen. Das Tooling für .NET Core in Visual Studio 2015 ist Vorschau 2 und die Codeabdeckung funktioniert bisher nicht. 

Der Blogbeitrag http://dotnetthoughts.net/measuring-code-coverage-of-aspnet-core-applications-using-opencover/ vom Februar zeigt eine Problemumgehung mithilfe der Befehlszeile der offenen Abdeckung. Ich bin auf der Suche nach einem integrierten Weg in Visual Studio. 

Hat jemand von einer besseren/integrierten Methode zur Messung von Code Coverage in Kombination mit XUnit gehört?

13
Ralf Bönning

Ich habe gerade die ReSharper-Version 2016.3 EAP 4 (Early Access Preview) ausprobiert. Neben der Unit-Test-Ausführung gibt dotCover jetzt Informationen zur Codeabdeckung für meine .NET-Kerntestprojekte zurück.

0
Ralf Bönning

Fügen Sie das NuGet-PaketMicrosoft.CodeCoverage 1.0.1 zu Ihrem project.json hinzu.

Ich arbeite an Template für Asp.NET und im Moment arbeite ich an Unit-Tests, also habe ich Ihren Beitrag gesehen. Sie könnten Projekt/Konfiguration hier sehen.

6
adenial

Disclaimer: Diese Schritte wurden aus Messung der ASP.NET-Kernabdeckung mit OpenCover - DotNetThoughts gegeben.

Obwohl das Poster über diese Site aussagt, dachte ich, es wäre immer noch am besten, diese Schritte hier zu haben, um Wohlstand zu erreichen.

NOTE: Diese Anweisungen, die auf ein Windows-Betriebssystem zugeschnitten sind, sollten problemlos für jedes von OpenCover und ReportGenerator unterstützte Betriebssystem funktionieren.

  1. Erstellen Sie Ihre ASP.NET Core MVC-Website
  2. Stellen Sie sicher, dass global.json in Projekten "testet"
  3. Klicken Sie mit der rechten Maustaste auf Testordner in der Lösung und fügen Sie ein neues Projekt hinzu
  4. Stellen Sie sicher, dass der Projekttyp eine .NET Core Class-Bibliothek ist
  5. Fügen Sie dem Knoten project.json-Abhängigkeiten Folgendes hinzu:
    • "dotnet-test-xunit": "2.2.0-preview2-build1029",
    • "xunit": "2.2.0-beta3-build3402"
    • "Microsoft.CodeCoverage": "1.0.2"
  6. Fügen Sie Ihrem Projekt.json unter Version Folgendes hinzu :__.
    • "testRunner": "xunit",
  7. Schreiben Sie Ihre Unit-Tests
  8. Download OpenCover und Report Generator
  9. Installieren Sie OpenCover
  10. Extrahieren Sie den Report Generator in das OpenCover-Installationsverzeichnis im Ordner Report Generator
  11. Erstellen Sie eine BAT-Datei in Ihrem Projekt und nennen Sie es cover.bat
  12. Fügen Sie folgenden Inhalt hinzu:
@echo off

SET dotnet="C:\Program Files\dotnet\dotnet.exe"  
SET opencover="C:\Program Files (x86)\OpenCover\OpenCover.Console.exe"
SET reportgenerator="C:\Program Files (x86)\OpenCover\ReportGenerator\ReportGenerator.exe"

SET targetargs="test"  
SET filter="+[*]NAMESPACE.* -[*.Test]* -[xunit.*]* -[FluentValidation]*"  
SET coveragefile=Coverage.xml  
SET coveragedir=Coverage

REM Run code coverage analysis  
%opencover% -oldStyle -register:user -target:%dotnet% -output:%coveragefile% -targetargs:%targetargs% -filter:%filter% -skipautoprops -hideskipped:All

REM Generate the report  
%reportgenerator% -targetdir:%coveragedir% -reporttypes:Html;Badges -reports:%coveragefile% -verbosity:Error

REM Open the report  
start "report" "%coveragedir%\index.htm"
  1. Ersetzen Sie den NAMESPACE durch den Namespace Ihres Projekts.
  2. Wenn mehrere Projekte vorhanden sind, duplizieren Sie den Regex +[*]NAMESPACE.* so oft, wie es für jeden Namespace erforderlich ist
  3. Speicher die Datei
  4. Öffnen Sie eine Eingabeaufforderung und stellen Sie sicher, dass Ihr Testprojekt vorhanden ist
  5. Geben Sie cover ein, um die Unit-Tests zum Laufen zu bringen und Ihre Coverage-Ergebnisse im HTML-Format oder wie auch immer Sie Ihre bat-Datei in Schritt 11 benannt haben.
5
Wayne

Die Codecoverage funktioniert für mich, für .Net Core mit Microsoft.CodeCoverage wie oben erwähnt.

Prüfen Sie, ob Sie Microsoft.CodeCoverage Nuget zu Ihrem Testprojekt hinzugefügt haben

Überprüfen Sie auch die Datei project.json in Ihrem Hauptprojekt. Das Attribut debugType sollte "full" anstelle von "portable" sein

  "buildOptions": {
    "emitEntryPoint": true,
    "preserveCompilationContext": true,
    "debugType": "full"
  },

Dies wurde für mich behoben

5
Carlos Soria

Coverlet ( https://github.com/tonerdo/coverlet ) ist ein neues Projekt, das kürzlich entstanden ist. Es arbeitet mit msbuild zusammen und bietet eine direkte Lösung für die Abdeckung

Ich habe Dinge mit ein paar URL-Hinweisen zum Laufen gebracht. (URLs unten)

Dies ist "der arme Mann", aber es wird eine HTM-Datei in Ihrem Standardbrowser mit einigen guten HTM-Berichten abfeuern. Und viel billiger als die Version VS 2017 ENTERPRISE!

Offensichtlich müssen Sie Ihr __unitTestProject auf den richtigen Wert setzen.

REM I call this file zzzCoverageRun.bat , or whatever name you want, but is a .bat file
REM PREREQUISITES
REM In Visual Studio, go to Tools / Nuget Package Manager / Package Manager Console
REM and run below line
REM dotnet tool install --global dotnet-reportgenerator-globaltool --version 4.0.15 


set __currentDirectory=%cd%

set __sln=%__currentDirectory%\..\Solutions\My.Solution.sln
set __unitTestProject=%__currentDirectory%\..\UnitTests\My.UnitTests.csproj


For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set __mydate=%%c-%%a-%%b)
For /f "tokens=1-3 delims=/:" %%a in ('time /t') do (set __mytime=%%a%%b%%c)
echo %__mydate%_%__mytime%


set __thisRunTag=%__localRepositoryName%%__mydate%_%__mytime%

set __coverageShortFileName=coverage.cobertura.xml
set __Common_TestResultsFileName=%TMP%\Zzz.TestResultsDirectory\%__thisRunTag%\%__coverageShortFileName%
REM set __ReportOutputDirectory=$(Build.SourcesDirectory)\TestResults\Coverage\Reports
set __ReportOutputDirectory=%TMP%\Zzz.CoverageResults\%__thisRunTag%
set __BuildConfiguration=Debug

REM build not needed
REM dotnet build "%__sln%"

dotnet test "%__unitTestProject%" --configuration %__BuildConfiguration% --logger:trx /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura /p:CoverletOutput="%__Common_TestResultsFileName%"

REM the below works because of the dotnet-reportgenerator-globaltool above
reportgenerator "-reports:%__Common_TestResultsFileName%" "-targetdir:%__ReportOutputDirectory%" -tag:%__thisRunTag% -reportTypes:htmlInline

start "" "%__ReportOutputDirectory%\index.htm"


set __coverageShortFileName=
set __currentDirectory=
set __ReportOutputDirectory=
set __sln=
set __unitTestProject=
set __Common_TestResultsFileName=
set __BuildConfiguration=
set __thisRunTag=

In meiner UnitTests.csproj ist Folgendes enthalten:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp2.1</TargetFramework>

    <IsPackable>false</IsPackable>

    <AssemblyName>My.UnitTests</AssemblyName>

    <RootNamespace>My.UnitTests</RootNamespace>
  </PropertyGroup>

  <ItemGroup>
    <None Remove="StyleCop.Cache" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="coverlet.msbuild" Version="2.6.0">
      <PrivateAssets>all</PrivateAssets>
      <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    <PackageReference Include="Microsoft.NET.Test.Sdk" Version="15.8.0" />
    <PackageReference Include="MSTest.TestAdapter" Version="1.3.2" />
    <PackageReference Include="MSTest.TestFramework" Version="1.3.2" />
    <PackageReference Include="Moq" Version="4.10.1" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="dotnet-reportgenerator-cli" Version="4.0.15" />
  </ItemGroup>  



</Project>

Bemerkenswert sind die "coverlet.msbuild" und "dotnet-reportgenerator-cli". Ich weiß, dass Sie "coverlet.msbuild" brauchen, der andere ist möglicherweise nur eine experimentelle Sache, die Sie vielleicht brauchen oder auch nicht.

Ich verwende eine Menge Fledermausvariablen, um Dinge zu steuern, und gebe sie in den Ordner% TMP% aus, um zu vermeiden, dass VS/git Dateien einchecken möchte.

Hinweise kamen von:

https://holsson.wordpress.com/2018/11/30/test-code-coverage-with-net-core-and-tfs/

https://tattoocoder.com/cross-platform-code-coverage-arrives-for-net-core/

https://medium.com/bluekiri/code-coverage-in-vsts-with-xunit-coverlet-and-reportgenerator-be2a64cd9c2f

1
granadaCoder

OpenCover + ReportGenerator. Installieren Sie als NUGET-Pakete in einem Ihrer Testprojekte (einmalig, da sie nur im Paketordner angezeigt werden müssen).

Dann können Sie dieses powershel https://github.com/rpokrovskij/opencover4vs.ps1 in Ihren Projektmappenordner legen und es mit Ihren Testprojekten einrichten, indem Sie Pfad-Globen verwenden, z.

$ TestProjectsGlobbing = @ (, '*. Test.csproj')

Dann können Sie es als normales Powershel-Skript ausführen. Das Ergebnis sollte im Lösungsordner in\TestsResults\report\index.html angezeigt werden

0