Megosztás a következőn keresztül:


Kódlefedettségi elemzés testreszabása

Alapértelmezés szerint a kódlefedettség elemzi az egységtesztek során betöltött összes megoldásszerelvényt. Javasoljuk, hogy ezt az alapértelmezett viselkedést használja, mert az általában jól működik. További információkért lásd: Hogyan használjuk a kódlefedettséget annak meghatározására, mennyi kód van tesztelve.

Ha ki szeretné zárni a tesztkódot a kódlefedettségi eredményekből, és csak az alkalmazáskódot szeretné belefoglalni, adja hozzá a ExcludeFromCodeCoverageAttribute attribútumot a tesztosztályhoz.

Ha olyan szerelvényeket szeretne belefoglalni, amelyek nem részei a megoldásnak, szerezze be a .pdb fájlokat ezekhez a szerelvényekhez, és másolja őket ugyanabba a mappába, amelybe a szerelvény .dll fájlokat.

Jegyzet

A kódlefedettség a Visual Studio Enterprise, a Community és a Professional kiadásokban érhető el. A Visual Studio 2022-ben és a korábbi verziókban a kódlefedettségi funkció a Visual Studio Enterprise kiadásra korlátozódott.

Jegyzet

A kódlefedettség csak a Visual Studio Enterprise-nal érhető el. A .NET-kódlefedettséghez használhatja a parancssori eszközt is, dotnet-coverage.

Beállításfájl futtatása

A futtatási beállításfájl az egységtesztelő eszközök által használt konfigurációs fájl. A speciális kódlefedettségi beállítások egy .runsettings fájlban vannak megadva.

A kódlefedettség testreszabásához kövesse az alábbi lépéseket:

  1. Adjon hozzá egy futtatási beállításfájlt a megoldáshoz. A megoldás helyi menüjében válassza MegoldáskezelőÚj elem>hozzáadásalehetőséget, majd válassza XML-fájllehetőséget. Mentse a fájlt olyan névvel, mint a CodeCoverage.runsettings.

    Ha nem látja az összes elemsablont, válassza Az összes sablon megjelenítéselehetőséget, majd válassza ki az elemsablont.

  2. A cikk végén adja hozzá a példafájl tartalmát, majd szabja testre az igényeinek megfelelően az alábbi szakaszokban leírtak szerint.

  3. Válasszon ki egy futtatási beállításfájlt.

    A Visual Studio 2019 16.4-es verziójától kezdve automatikusan kijelölhet egy futtatási beállításfájlt a projekt gyökérkönyvtárában. Ellenkező esetben a Teszt menüben válassza a Futtatási beállítások konfigurálásalehetőséget, majd válassza a Megoldásszintű futtatási beállítások fájllehetőséget. Ha meg szeretne adni egy futtatási beállításfájlt a tesztek parancssorból való futtatásához, olvassa el Egységtesztek konfigurálásacímű témakört.

    Amikor a Kódlefedettség elemzéselehetőséget választja, a rendszer a konfigurációs adatokat a futtatási beállítások fájljából olvassa be.

    Borravaló

    A korábbi kódlefedettségi eredmények és kódszínezések nem rejtik el automatikusan a tesztek futtatásakor vagy a kód frissítésekor.

    Ha ki és be szeretné kapcsolni az egyéni beállításokat, törölje vagy jelölje ki a fájlt a Tesztelés menüben.

    A futtatási beállítások fájljának kiválasztásához a Tesztelés menüben válassza a Beállításfájl kiválasztásalehetőséget. Ha meg szeretne adni egy futtatási beállításfájlt a tesztek parancssorból való futtatásához, olvassa el Egységtesztek konfigurálásacímű témakört.

    Amikor a Kódlefedettség elemzéselehetőséget választja, a rendszer a konfigurációs adatokat a futtatási beállítások fájljából olvassa be.

    Borravaló

    A korábbi kódlefedettségi eredmények és kódszínezések nem rejtik el automatikusan a tesztek futtatásakor vagy a kód frissítésekor.

    Az egyéni beállítások ki- és bekapcsolásához válassza a Teszt, Futtatási beállítások konfigurálásalehetőséget, majd törölje vagy jelölje ki a fájlnevet.

Szimbólumkeresési útvonalak

A kódlefedettséghez szimbólumfájlokra (.pdb fájlokra) van szükség a assembly-khez. A megoldás által létrehozott szerelvények esetében a bináris fájlok mellett általában szimbólumfájlok találhatók, és a kódlefedettség automatikusan működik. Bizonyos esetekben érdemes lehet a hivatkozott szerelvényeket is belefoglalni a kódlefedettségi elemzésbe. Ilyen esetekben előfordulhat, hogy a .pdb fájlok nem szomszédosak a bináris fájlokkal, de megadhatja a szimbólumkeresési útvonalat a .runsettings fájlban.

<SymbolSearchPaths>
      <Path>\\mybuildshare\builds\ProjectX</Path>
      <!--More paths if required-->
</SymbolSearchPaths>

Jegyzet

A szimbólumfeloldás sok időt vehet igénybe, különösen akkor, ha sok szerelvényt tartalmazó távoli fájlhelyet használ. Ezért érdemes lehet .pdb fájlokat a bináris (.dll és .exe) fájlokkal megegyező helyi helyre másolni.

Szerelvények és tagok belefoglalása vagy kizárása

A kódlefedettség-elemzésbe belefoglalhatja vagy kizárhatja a szerelvényeket vagy bizonyos típusokat és tagokat. Ha a Belefoglalás szakasz üres vagy hiányzik, akkor minden betöltött összeállítás, amely rendelkezik társított PDB fájlokkal, belefoglalódik. Ha egy szerelvény vagy tag megfelel a Kizárás szakaszban szereplő záradéknak, akkor nem szerepel a kódlefedettségben. A Kizárás szakasz elsőbbséget élvez a Belefoglalás szakasszal szemben: ha egy szerelvény szerepel mind a Belefoglalás, mind a Kizárásszakaszban, akkor az nem fog szerepelni a kódlefedettségben.

A következő XML például kizár egyetlen szerelvényt a nevének megadásával:

<ModulePaths>
  <Exclude>
   <ModulePath>.*Fabrikam.Math.UnitTest.dll</ModulePath>
   <!-- Add more ModulePath nodes here. -->
  </Exclude>
</ModulePaths>

Az alábbi példa azt határozza meg, hogy csak egyetlen szerelvény szerepeljen a kódlefedettségben:

<ModulePaths>
  <Include>
   <ModulePath>.*Fabrikam.Math.dll</ModulePath>
   <!-- Add more ModulePath nodes here. -->
  </Include>
</ModulePaths>

Az alábbi táblázat bemutatja az összeállítások és tagok különféle módjait, hogy hogyan illeszthetők be vagy zárhatóak ki a kódlefedettségből.

XML-elem Mihez illeszkedik
ModulePath Megfelel a megadott assembly nevével vagy fájl elérési útjával.
Cégnév Az összeállításokat a cég attribútuma alapján egyezteti.
PublicKeyToken Nyilvános kulcs token által aláírt összetevőket ellenőriz.
Forrás Az elemeket annak a forrásfájlnak az útvonala alapján határozza meg, amelyben definiálva vannak.
Attribútum Megfelel a megadott attribútummal rendelkező elemeknek. Adja meg az attribútum teljes nevét, például <Attribute>^System\.Diagnostics\.DebuggerHiddenAttribute$</Attribute>.

Ha kizárja a CompilerGeneratedAttribute attribútumot, az olyan nyelvi funkciókat használó kód, mint a async, a await, a yield returnés az automatikusan implementált tulajdonságok ki lesznek zárva a kódlefedettség-elemzésből. A valóban létrehozott kód kizárásához csak a GeneratedCodeAttribute attribútumot zárja ki.
Funkció Az eljárásokat, függvényeket vagy metódusokat teljes névvel egyezteti meg, beleértve a paraméterlistát is. A név egy részét egy reguláris kifejezéssel is egyeztetheti.

Példák:

Fabrikam.Math.LocalMath.SquareRoot(double); (C#)

Fabrikam::Math::LocalMath::SquareRoot(double) (C++)

Kódlefedettségi formátumok

Alapértelmezés szerint a kódlefedettség egy .coverage fájlban lesz összegyűjtve és mentve. A lefedettséget más formátumok, például XML és Cobertura használatával is gyűjtheti. A különböző formátumok különböző szerkesztőkben és folyamatokban lehetnek hasznosak. Ezt a lehetőséget a runsettings fájl <Format>Cobertura</Format><Format>Xml</Format> vagy hozzáadásával engedélyezheti. Ez a formátum a Visual Studióban a kódlefedettségi eredmények ablakában tekinthető meg.

A parancssortól eltérő formátumokat is megadhat a runsettings fájlban való megadásával vagy egy paraméterben való megadásával. Például a dotnet parancssorban a dotnet test --collect:"Code Coverage;Format=Cobertura"használata. A vstest használatához vstest.console.exe /collect:"Code Coverage;Format=Cobertura". A collect paraméter felülbírálja a runsettingsban megadott formátumot.

Statikus és dinamikus natív műszeres technika

A Visual Studio 2022 17.2-es verziójában hozzáadtuk a lehetőséget a natív binárisok statikus eszközlésére, közvetlenül lemezen. A korábbi verziókban csak a dinamikus műszeres mérést támogattuk, amely gyakran nem tudta a módszereket műszerezni. A statikus natív műszerelés stabilabb, ezért ajánlott. A statikus natív műszeresítéshez engedélyezni kell a /PROFILE link opciót minden olyan natív projekthez, amelyhez kódlefedettséget szeretne gyűjteni.

A natív statikus instrumentáció engedélyezhető a runsettings fájlban úgy, hogy <EnableStaticNativeInstrumentation>True</EnableStaticNativeInstrumentation> értéket ad a <CodeCoverage> címke alá. Ezt a módszert parancssori forgatókönyvekhez használhatja.

Alapértelmezés szerint a dinamikus natív instrumentáció mindig engedélyezve van. Ha a statikus és a dinamikus rendszerállapot is engedélyezve van, a Visual Studio statikusan próbálja meg a C++-kód rendszerezését, de ha ez nem lehetséges (például ha a /PROFILE kapcsolati lehetőség nincs engedélyezve), a rendszer dinamikus rendszerállapot-kialakítást használ. A dinamikus natív instrumentáció teljes mértékben letiltható a runsettings fájlban, ha hozzáadja a <EnableDynamicNativeInstrumentation>False</EnableDynamicNativeInstrumentation> elemet a <CodeCoverage>alá.

Ha a statikus natív rendszerállapot engedélyezve van, a natív bináris fájlok a tesztelés végrehajtása előtt lemezen lesznek rendszerezve és lecserélve. Az eredeti bináris fájlok a teszt végrehajtása után lesznek visszaállítva. Az eredeti fájlok visszaállítását letilthatja a runsettingsban a <EnableStaticNativeInstrumentationRestore>False</EnableStaticNativeInstrumentationRestore> címke alatti <CodeCoverage> hozzáadásával. Ez különösen hasznos lehet CI-forgatókönyvekben.

Ha a statikus natív rendszerállapot engedélyezve van, a Visual Studio az összes natív bináris fájlt megkeresi és rendszerezi abban a könyvtárban, ahol a teszt bináris található. További könyvtárakat is megadhat, ahol a bináris fájlokat keresni kell. Az alábbi példa azt határozza meg, hogy az C:\temp és alkönyvtáraiból származó natív bináris fájlokat a Fabrikam.Math.dllvégződő fájlok kivételével kell formázni.

<ModulePaths>
  <IncludeDirectories>
    <Directory Recursive="true">C:\temp</Directory>
  </IncludeDirectories>
  <Exclude>
    <ModulePath>.*Fabrikam.Math.dll</ModulePath>
  </Exclude>
</ModulePaths>

Tesztszerelvények belefoglalása vagy kizárása

Ha tesztszerelvényeket szeretne belefoglalni vagy kizárni a lefedettségi jelentésből, a <IncludeTestAssembly> elemet használhatja a <Configuration> szakaszban a .runsettings fájlban.

Ebben a példában a <IncludeTestAssembly> beállítása False-re kizárja a tesztösszeállításokat a kódlefedettségi jelentésből. Ha tesztszerelvényeket szeretne beilleszteni, állítsa be az értéket True-ra.

<?xml version="1.0" encoding="utf-8"?>
<!-- File name extension must be .runsettings -->
<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>
          <IncludeTestAssembly>False</IncludeTestAssembly>
          ...
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>

Jegyzet

A IncludeTestAssembly alapértelmezett értéke , míg a truefalse. Ez azt jelenti, hogy a tesztprojektek alapértelmezés szerint bele vannak foglalva. További információ: Kódlefedettségi konfiguráció.

Reguláris kifejezések

A csomópontok belefoglalása és kizárása normál kifejezéseket használ, amelyek nem azonosak a helyettesítő karakterekkel. Minden egyezés nem érzékeny a kis- és nagybetűkre. Néhány példa:

  • .* egy tetszőleges karaktersorozatot illeszt vagy egyeztet

  • \. egy "" pontnak felel meg.

  • \( \) egyezik a(z) "( )" zárójelekkel

  • \\ megegyezik a "\" fájlútvonal-elválasztóval

  • ^ a karakterlánc elején található

  • $ a szöveg végének felel meg

Az alábbi XML bemutatja, hogyan lehet befoglalni és kizárni bizonyos szerelvényeket normál kifejezések használatával:

<ModulePaths>
  <Include>
    <!-- Include all loaded .dll assemblies (but not .exe assemblies): -->
    <ModulePath>.*\.dll$</ModulePath>
  </Include>
  <Exclude>
    <!-- But exclude some assemblies: -->
    <ModulePath>.*\\Fabrikam\.MyTests1\.dll$</ModulePath>
    <!-- Exclude all file paths that contain "Temp": -->
    <ModulePath>.*Temp.*</ModulePath>
  </Exclude>
</ModulePaths>

Az alábbi XML bemutatja, hogyan foglalhatók bele és zárhatók ki bizonyos függvények normál kifejezések használatával:

<Functions>
  <Include>
    <!-- Include methods in the Fabrikam namespace: -->
    <Function>^Fabrikam\..*</Function>
    <!-- Include all methods named EqualTo: -->
    <Function>.*\.EqualTo\(.*</Function>
  </Include>
  <Exclude>
    <!-- Exclude methods in a class or namespace named UnitTest: -->
    <Function>.*\.UnitTest\..*</Function>
  </Exclude>
</Functions>

Figyelmeztetés

Ha hiba lép fel egy reguláris kifejezésben, például egy nem beágyazott vagy nem egyező zárójelben, a kódlefedettség elemzése nem fog futni.

A reguláris kifejezésekről további információt a Reguláris kifejezések használata a Visual Studio. című témakörben talál.

Minta .runsettings fájl

Másolja ki ezt a kódot, és szerkessze az igényeinek megfelelően.

<?xml version="1.0" encoding="utf-8"?>
<!-- File name extension must be .runsettings -->
<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>
          <Format>coverage</Format>
          <!-- When set to False, test assemblies will not be added to the coverage report. -->
          <IncludeTestAssembly>True</IncludeTestAssembly>
          <CodeCoverage>
<!--
Additional paths to search for .pdb (symbol) files. Symbols must be found for modules to be instrumented.
If .pdb files are in the same folder as the .dll or .exe files, they are automatically found. Otherwise, specify them here.
Note that searching for symbols increases code coverage runtime. So keep this small and local.
-->
<!--
            <SymbolSearchPaths>
                   <Path>C:\Users\username\source\repos\ProjectX</Path>
                   <Path>\\mybuildshare\builds\ProjectX</Path>
            </SymbolSearchPaths>
-->

<!--
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 /visualstudio/ide/using-regular-expressions-in-visual-studio.
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.
-->

            <!-- Match assembly file paths: -->
            <ModulePaths>
              <Include>
                <ModulePath>.*\.dll$</ModulePath>
                <ModulePath>.*\.exe$</ModulePath>
              </Include>
              <Exclude>
                <ModulePath>.*CPPUnitTestFramework.*</ModulePath>
              </Exclude>
              <!-- Specifies additional list of directories where binaries static native instrumentation should be searched. -->
              <IncludeDirectories>
                <Directory Recursive="true">C:\b59fb11c-1611-4562-9a2b-c35719da65d3</Directory>
              </IncludeDirectories>
            </ModulePaths>

            <!-- Match fully qualified names of functions: -->
            <!-- (Use "\." to delimit namespaces in C# or Visual Basic, "::" in C++.)  -->
            <Functions>
              <Exclude>
                <Function>^Fabrikam\.UnitTest\..*</Function>
                <Function>^std::.*</Function>
                <Function>^ATL::.*</Function>
                <Function>.*::__GetTestMethodInfo.*</Function>
                <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
                <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
              </Exclude>
            </Functions>

            <!-- Match attributes on any code element: -->
            <Attributes>
              <Exclude>
                <!-- Don't forget "Attribute" at the end of the name -->
                <Attribute>^System\.Diagnostics\.DebuggerHiddenAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.DebuggerNonUserCodeAttribute$</Attribute>
                <Attribute>^System\.CodeDom\.Compiler\.GeneratedCodeAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$</Attribute>
              </Exclude>
            </Attributes>

            <!-- Match the path of the source files in which each method is defined: -->
            <Sources>
              <Exclude>
                <Source>.*\\atlmfc\\.*</Source>
                <Source>.*\\vctools\\.*</Source>
                <Source>.*\\public\\sdk\\.*</Source>
                <Source>.*\\microsoft sdks\\.*</Source>
                <Source>.*\\vc\\include\\.*</Source>
              </Exclude>
            </Sources>

            <!-- Match the company name property in the assembly: -->
            <CompanyNames>
              <Exclude>
                <CompanyName>.*microsoft.*</CompanyName>
              </Exclude>
            </CompanyNames>

            <!-- Match the public key token of a signed assembly: -->
            <PublicKeyTokens>
              <!-- Exclude Visual Studio extensions: -->
              <Exclude>
                <PublicKeyToken>^B77A5C561934E089$</PublicKeyToken>
                <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>
                <PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken>
                <PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken>
                <PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken>
                <PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken>
                <PublicKeyToken>^E361AF139669C375$</PublicKeyToken>
              </Exclude>
            </PublicKeyTokens>

            <!-- We recommend you do not change the following values: -->

            <!-- Set this to True to collect coverage information for functions marked with the "SecuritySafeCritical" attribute. Instead of writing directly into a memory location from such functions, code coverage inserts a probe that redirects to another function, which in turns writes into memory. -->
            <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
            <!-- When set to True, collects coverage information from child processes that are launched with low-level ACLs, for example, UWP apps. -->
            <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
            <!-- When set to True, collects coverage information from child processes that are launched by test or production code. -->
            <CollectFromChildProcesses>True</CollectFromChildProcesses>
            <!-- When set to True, restarts the IIS process and collects coverage information from it. -->
            <CollectAspDotNet>False</CollectAspDotNet>
            <!-- When set to True, static native instrumentation will be enabled. -->
            <EnableStaticNativeInstrumentation>True</EnableStaticNativeInstrumentation>
            <!-- When set to True, dynamic native instrumentation will be enabled. -->
            <EnableDynamicNativeInstrumentation>True</EnableDynamicNativeInstrumentation>
            <!-- When set to True, instrumented binaries on disk are removed and original files are restored. -->
            <EnableStaticNativeInstrumentationRestore>True</EnableStaticNativeInstrumentationRestore>
          </CodeCoverage>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>
<?xml version="1.0" encoding="utf-8"?>
<!-- File name extension must be .runsettings -->
<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>
<!--
Additional paths to search for .pdb (symbol) files. Symbols must be found for modules to be instrumented.
If .pdb files are in the same folder as the .dll or .exe files, they are automatically found. Otherwise, specify them here.
Note that searching for symbols increases code coverage runtime. So keep this small and local.
-->
<!--
            <SymbolSearchPaths>
                   <Path>C:\Users\username\source\repos\ProjectX</Path>
                   <Path>\\mybuildshare\builds\ProjectX</Path>
            </SymbolSearchPaths>
-->

<!--
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 /visualstudio/ide/using-regular-expressions-in-visual-studio.
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.
-->

            <!-- Match assembly file paths: -->
            <ModulePaths>
              <Include>
                <ModulePath>.*\.dll$</ModulePath>
                <ModulePath>.*\.exe$</ModulePath>
              </Include>
              <Exclude>
                <ModulePath>.*CPPUnitTestFramework.*</ModulePath>
              </Exclude>
              <!-- Specifies additional list of directories where binaries static native instrumentation should be searched. -->
              <IncludeDirectories>
                <Directory Recursive="true">C:\b59fb11c-1611-4562-9a2b-c35719da65d3</Directory>
              </IncludeDirectories>
            </ModulePaths>

            <!-- Match fully qualified names of functions: -->
            <!-- (Use "\." to delimit namespaces in C# or Visual Basic, "::" in C++.)  -->
            <Functions>
              <Exclude>
                <Function>^Fabrikam\.UnitTest\..*</Function>
                <Function>^std::.*</Function>
                <Function>^ATL::.*</Function>
                <Function>.*::__GetTestMethodInfo.*</Function>
                <Function>^Microsoft::VisualStudio::CppCodeCoverageFramework::.*</Function>
                <Function>^Microsoft::VisualStudio::CppUnitTestFramework::.*</Function>
              </Exclude>
            </Functions>

            <!-- Match attributes on any code element: -->
            <Attributes>
              <Exclude>
                <!-- Don't forget "Attribute" at the end of the name -->
                <Attribute>^System\.Diagnostics\.DebuggerHiddenAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.DebuggerNonUserCodeAttribute$</Attribute>
                <Attribute>^System\.CodeDom\.Compiler\.GeneratedCodeAttribute$</Attribute>
                <Attribute>^System\.Diagnostics\.CodeAnalysis\.ExcludeFromCodeCoverageAttribute$</Attribute>
              </Exclude>
            </Attributes>

            <!-- Match the path of the source files in which each method is defined: -->
            <Sources>
              <Exclude>
                <Source>.*\\atlmfc\\.*</Source>
                <Source>.*\\vctools\\.*</Source>
                <Source>.*\\public\\sdk\\.*</Source>
                <Source>.*\\microsoft sdks\\.*</Source>
                <Source>.*\\vc\\include\\.*</Source>
              </Exclude>
            </Sources>

            <!-- Match the company name property in the assembly: -->
            <CompanyNames>
              <Exclude>
                <CompanyName>.*microsoft.*</CompanyName>
              </Exclude>
            </CompanyNames>

            <!-- Match the public key token of a signed assembly: -->
            <PublicKeyTokens>
              <!-- Exclude Visual Studio extensions: -->
              <Exclude>
                <PublicKeyToken>^B77A5C561934E089$</PublicKeyToken>
                <PublicKeyToken>^B03F5F7F11D50A3A$</PublicKeyToken>
                <PublicKeyToken>^31BF3856AD364E35$</PublicKeyToken>
                <PublicKeyToken>^89845DCD8080CC91$</PublicKeyToken>
                <PublicKeyToken>^71E9BCE111E9429C$</PublicKeyToken>
                <PublicKeyToken>^8F50407C4E9E73B6$</PublicKeyToken>
                <PublicKeyToken>^E361AF139669C375$</PublicKeyToken>
              </Exclude>
            </PublicKeyTokens>

            <!-- We recommend you do not change the following values: -->

            <!-- Set this to True to collect coverage information for functions marked with the "SecuritySafeCritical" attribute. Instead of writing directly into a memory location from such functions, code coverage inserts a probe that redirects to another function, which in turns writes into memory. -->
            <UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
            <!-- When set to True, collects coverage information from child processes that are launched with low-level ACLs, for example, UWP apps. -->
            <AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
            <!-- When set to True, collects coverage information from child processes that are launched by test or production code. -->
            <CollectFromChildProcesses>True</CollectFromChildProcesses>
            <!-- When set to True, restarts the IIS process and collects coverage information from it. -->
            <CollectAspDotNet>False</CollectAspDotNet>

          </CodeCoverage>
        </Configuration>
      </DataCollector>
    </DataCollectors>
  </DataCollectionRunSettings>
</RunSettings>