24

複数のプロジェクトを含むソリューションのコード カバレッジを実行すると、コード カバレッジにテスト アセンブリも含まれていることに気付きました。

.runsettings の次のテンプレートを提案する記事を見つけました。

<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
  <DataCollectionRunSettings>
    <DataCollectors>
      <DataCollector friendlyName="Code Coverage" uri="datacollector://Microsoft/CodeCoverage/2.0" assemblyQualifiedName="Microsoft.VisualStudio.Coverage.DynamicCoverageDataCollector, Microsoft.VisualStudio.TraceCollector, Version=11.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
        <Configuration>
          <CodeCoverage>
            <ModulePaths>
              <Include>
                <!-- Do not specify any includes. This will attempt to include all binaries -->
              </Include>
              <Exclude>
                <!-- Exclude modules that aren't to be processed, by their name / path -->
                <ModulePath>.*Tests\.dll$</ModulePath> <!-- I put it here -->
              </Exclude>
            </ModulePaths>

            <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
            <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
            <CollectFromChildProcesses>True</CollectFromChildProcesses>
            <CollectAspDotNet>False</CollectAspDotNet>
            <!--
Additional paths to search for symbol files. Symbols must be found for modules to be instrumented.
If symbols are alongside the binaries, they are automatically picked up. Otherwise specify the here.
Note that searching for symbols increases code coverage runtime. So keep this small and local.

<SymbolSearchPaths>             
  <Path>C:\Users\User\Documents\Visual Studio 11\Projects\ProjectX\bin\Debug</Path>
  <Path>\\mybuildshare\builds\ProjectX</Path>
</SymbolSearchPaths>
-->
            <Functions>
              <Exclude>
                <Function>^std::.*</Function>
                <Function>^ATL::.*</Function>
                <Function>.*::__GetTestMethodInfo.*</Function>
                <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
                <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
                <Function>.*::YOU_CAN_ONLY_DESIGNATE_ONE_.*</Function>
              </Exclude>
            </Functions>
            <Attributes>
              <Exclude>
                <Attribute>^System.Diagnostics.DebuggerHiddenAttribute$</Attribute>
                <Attribute>^System.Diagnostics.DebuggerNonUserCodeAttribute$</Attribute>
                <Attribute>^System.Runtime.CompilerServices.CompilerGeneratedAttribute$</Attribute>
                <Attribute>^System.CodeDom.Compiler.GeneratedCodeAttribute$</Attribute>
                <Attribute>^System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute$</Attribute>
              </Exclude>
            </Attributes>
            <Sources>
              <Exclude>
                <Source>.*\\atlmfc\\.*</Source>
                <Source>.*\\vctools\\.*</Source>
                <Source>.*\\public\\sdk\\.*</Source>
                <Source>.*\\microsoft sdks\\.*</Source>
                <Source>.*\\vc\\include\\.*</Source>
              </Exclude>
            </Sources>
            <CompanyNames>
              <Exclude>
                <CompanyName>.*microsoft.*</CompanyName>
              </Exclude>
            </CompanyNames>
            <PublicKeyTokens>
              <Exclude>
                <PublicKeyToken>^B77A5C561934E089$</PublicKeyToken>
                <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>
                <PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken>
                <PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken>
                <PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken>
                <PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken>
                <PublicKeyToken>^E361AF139669C375$</PublicKeyToken>
              </Exclude>
            </PublicKeyTokens>
          </CodeCoverage>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

ここでの問題は、TEST\Test 設定メニューで .runsettings ファイルを確認するとすぐに、コード カバレッジがソリューション内の多くのアセンブリの 1 つだけを分析することを確認することです。

線を抜いても

 <ModulePath>.*Tests\.dll$</ModulePath> <!-- I put it here -->

1 つのアセンブリのみが解析されます。すべてのアセンブリをインクルード リストに追加したくないので、すべてのテスト アセンブリを除外する必要があります。

.runsettings によってコード カバレッジが VS ソリューション内のアセンブリの 1 つだけを参照するようになるのはなぜですか?

4

5 に答える 5

25

問題は期間です。何らかの理由で、正規表現はそれを窒息させています。次のようにピリオドをエスケープすることで回避できます。

<ModulePaths>
    <Include>
        <ModulePath>.*MyCompany\.Namespace\.Project\.dll$</ModulePath>
    </Include>
    <Exclude>
        <ModulePath>.*ThirdParty\.Namespace\.Project\.dll$</ModulePath>
    </Exclude>
</ModulePaths>

また、空のインクルードは有効であり、すべてのモジュールが含まれていることを意味します。Microsoft 提供のサンプルのコメントには、次のように記載されています。

<!--
About include/exclude lists:
Empty "Include" clauses imply all; empty "Exclude" clauses imply none.
Each element in the list is a regular expression (ECMAScript syntax).
See http://msdn.microsoft.com/library/2k3te2cs.aspx.
An item must first match at least one entry in the include list to be included.
Included items must then not match any entries in the exclude list to remain included.
-->
于 2013-05-17T20:01:26.260 に答える
14

関連して、インクルード パスとエクスクルード パスの正規表現の性質について少しはっきりと考えていたので、この投稿に出くわしました。私の WPF アプリケーションでは、Caliburn.Micro のカバレッジ分析を除外したいと考えていました。だから私は書いていた

<ModulePath>Caliburn.Micro.dll</ModulePath>

明らかに、期間は私を台無しにしています。この質問にはその問題はありませんが、この単純な事実を見落としているのは私だけではありません。他の読者の方は、* はワイルドカードではなく、正規表現の「任意の数」演算子であることにも注意してください。あなたは望んでいません*.Caliburnが、むしろ.*Caliburnこの簡単なステートメントは私の問題を解決しました:

<ModulePath>.*Caliburn.*</ModulePath>

モジュール名だけでなくパスを探しているため、モジュールを無視するには、モジュールの前に .* が必要です。つまり、任意のファイル パスでモジュールを無視したいということです。

于 2013-04-12T01:39:33.393 に答える
2

<ModulePaths>(ASP.NET Core 2.1 を使用して) 確実に動作する ようになるには、あらゆる種類の問題がありました。

最終的には、 を使用する<Sources>方が簡単で信頼性が高く、必要に応じて正確に機能することがわかりました。正規表現の使用に関するアドバイスを引き続き活用します。

ソリューション パスを含め、すべてのテスト プロジェクトが存在する \tests サブフォルダーを除外します。RunSettings xml ファイルの CodeCoverage 要素の例:

<CodeCoverage>
  <Sources>
    <Include>
      <Source>.*\\My\.Solution\.Name\.Space\\.*</Source> <!-- ie: include *\My.Solution.Name.Space\* -->
    </Include>
    <Exclude>
      <Source>.*\\My\.Solution\.Name\.Space\\Tests\\.*</Source> <!-- ie: exclude *\My.Solution.Name.Space\Tests\* -->
    </Exclude>
  </Sources>
  <!-- removed for brevity -->
<CodeCoverage>

詳細については、MS Docs のコード カバレッジのカスタマイズを参照してください。

于 2018-09-28T08:55:23.200 に答える