web-dev-qa-db-ja.com

Visual StudioのASP.NET Coreプロジェクトでコードカバレッジを測定する方法

ASP.NET CoreアプリケーションでXUnit-Testsのコードカバレッジを測定したいと思います。 Visual Studio 2015のTooling for .NET Coreはプレビュー2であり、コードカバレッジはこれまでのところ機能しません。

2月のブログ投稿 http://dotnetthoughts.net/measuring-code-coverage-of-aspnet-core-applications-using-opencover/ は、オープンカバーのコマンドラインを使用した回避策を示しています。 Visual Studio内でより統合された方法を探しています。

XUnitと組み合わせてコードカバレッジを測定するより良い/より統合された方法を聞いたことがありますか?

14
Ralf Bönning

ReSharperバージョン2016.3 EAP 4(早期アクセスプレビュー)を試しました。単体テストの実行に加えて、dotCoverは.netコアテストプロジェクトのコードカバレッジ情報を返します。

0
Ralf Bönning

NuGetパッケージMicrosoft.CodeCoverage 1.0.1project.jsonに追加します。

私はAsp.NETのテンプレートに取り組んでいます。現在、ユニットテストに取り組んでいるので、あなたの投稿を見ました。プロジェクト/構成 ここ が表示されます。

7
adenial

免責事項:これらの手順は OpenCoverでのASP.NETコアカバレッジの測定-DotNetThoughts から提供されました。

ポスターはこのサイトについて語っていますが、繁栄のためにこれらのステップをここに置くことがまだ最善だと思いました。

[〜#〜]注[〜#〜]:これらの手順は、Windowsオペレーティングシステムに合わせて調整されているため、OpenCoverおよびReportGeneratorでサポートされているすべてのO/Sで簡単に機能します。

  1. ASP.NET Core MVC Webサイトを作成する
  2. プロジェクトでglobal.jsonに「テスト」があることを確認する
  3. ソリューションのテストフォルダーを右クリックし、新しいプロジェクトを追加します
  4. プロジェクトタイプが.NET Core Classライブラリであることを確認します
  5. 以下をproject.json依存関係ノードに追加します:
    • "dotnet-test-xunit": "2.2.0-preview2-build1029"、
    • "xunit": "2.2.0-beta3-build3402"
    • "Microsoft.CodeCoverage": "1.0.2"
  6. 以下をproject.jsonのversion に追加します。
    • "testRunner": "xunit"、
  7. 単体テストを書く
  8. ダウンロード OpenCover および Report Generator
  9. OpenCoverをインストールする
  10. レポートジェネレーターと呼ばれるフォルダーのOpenCoverインストールディレクトリにレポートジェネレーターを抽出する
  11. プロジェクトにBATファイルを作成し、cover.batという名前を付けます
  12. 次の内容を追加します。
@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. NAMESPACEをプロジェクトの名前空間に置き換えます。
  2. 複数のプロジェクトの場合は、正規表現を複製します+[*]NAMESPACE.*名前空間ごとに必要な回数だけ
  3. ファイルを保存します
  4. コマンドプロンプトを開き、テストプロジェクトで確認します
  5. カバーを入力してユニットテストを実行し、カバレッジ結果をHTML形式、または手順11でbatファイルに付けた名前を入力します。
5
Wayne

上記のMicrosoft.CodeCoverageを使用した.Net Coreでは、コードカバレッジが機能します。

テストプロジェクトにMicrosoft.CodeCoverage nugetが追加されていることを確認してください

また、メインプロジェクトのproject.jsonファイルも確認してください。debugType属性は、「portable」ではなく「full」にする必要があります。

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

これは私のために修正されました

5
Carlos Soria

Coverlet( https://github.com/tonerdo/coverlet )は、最近登場した新しいプロジェクトです。 msbuildと一緒に機能し、カバレッジの簡単なソリューションを提供します

いくつかのURLヒントを使用して作業しました。 (下部のURL)

これは「貧乏人」ですが、デフォルトのブラウザでhtmファイルを起動し、適切なカバレッジhtmレポートを表示します。 VS 2017 ENTERPRISEバージョンよりもはるかに安い!

もちろん、__ unitTestProjectを正しい値に設定する必要があります。

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=

私のUnitTests.csprojはこれを持っています:

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

注目すべきは、「coverlet.msbuild」と「dotnet-reportgenerator-cli」です。 「coverlet.msbuild」が必要なのはわかっていますが、もう1つは、必要のない、または必要のない実験的なものです。

私は多くのbat変数を使用して物事を動かし、VS/gitがファイルをチェックインすることを回避するために%TMP%フォルダーに出力しています。

ヒントは以下から来ました:

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。テストプロジェクトの1つにNUGETパッケージとしてインストールします(パッケージフォルダーに表示する必要があるため、一度だけ)。

次に、このpowershel https://github.com/rpokrovskij/opencover4vs.ps1 をソリューションフォルダーに配置し、パスグロビングを使用してテストプロジェクトで設定できます。

$ TestProjectsGlobbing = @(、 '*。Test.csproj')

その後、通常のPowershelスクリプトとして実行できます。結果は\ TestsResults\report\index.htmlのSolution Folderに表示されます

0