Kod kapsamı analizini özelleştirme
Varsayılan olarak, kod kapsamı birim testleri sırasında yüklenen tüm çözüm derlemelerini analiz eder. Çoğu zaman düzgün çalıştığından bu varsayılan davranışı kullanmanızı öneririz. Daha fazla bilgi için bkz . Test edilen kodun miktarını belirlemek için kod kapsamını kullanma.
Test kodunu kod kapsamı sonuçlarından dışlamak ve yalnızca uygulama kodunu eklemek için özniteliğini ExcludeFromCodeCoverageAttribute test sınıfınıza ekleyin.
Çözümünüzün parçası olmayan derlemeleri eklemek için, bu derlemeler için .pdb dosyalarını alın ve bunları derleme .dll dosyalarıyla aynı klasöre kopyalayın.
Çalıştırma ayarları dosyası
Çalıştırma ayarları dosyası, birim testi araçları tarafından kullanılan yapılandırma dosyasıdır. Gelişmiş kod kapsamı ayarları bir .runsettings dosyasında belirtilir.
Kod kapsamını özelleştirmek için şu adımları izleyin:
Çözümünüze bir çalıştırma ayarları dosyası ekleyin. Çözüm Gezgini'da, çözümünüzün kısayol menüsünde Yeni Öğe Ekle'yi>ve ardından XML Dosyası'nı seçin. Dosyayı CodeCoverage.runsettings gibi bir adla kaydedin.
Tüm öğe şablonlarını görmüyorsanız, Tüm Şablonları Göster'i ve ardından öğe şablonunu seçin.
Bu makalenin sonundaki örnek dosyadan içeriği ekleyin ve ardından izleyen bölümlerde açıklandığı gibi gereksinimlerinize göre özelleştirin.
Çalıştırma ayarları dosyasını seçin.
Visual Studio 2019 sürüm 16.4'den başlayarak, proje kökünde bir çalıştırma ayarları dosyasını otomatik olarak algılayabilirsiniz. Aksi takdirde, Test menüsünde Çalıştırma Ayarlar Yapılandır'ı ve ardından Çözüm Geniş çalıştırma ayarları Dosyasını Seç'i seçin. Komut satırından testleri çalıştırmak için bir çalıştırma ayarları dosyası belirtmek için bkz . Birim testlerini yapılandırma.
Kod Kapsamını Çözümle'yi seçtiğinizde, yapılandırma bilgileri çalıştırma ayarları dosyasından okunur.
İpucu
Testleri çalıştırdığınızda veya kodunuzu güncelleştirdiğinizde önceki kod kapsamı sonuçları ve kod renklendirmeleri otomatik olarak gizlenmiyor.
Özel ayarları kapatıp açmak için, Test menüsünde dosyanın seçimini kaldırın veya seçin.
Çalıştırma ayarları dosyasını seçmek için Test menüsünde Dosya Ayarlar Seç'i seçin. Komut satırından testleri çalıştırmak için bir çalıştırma ayarları dosyası belirtmek için bkz . Birim testlerini yapılandırma.
Kod Kapsamını Çözümle'yi seçtiğinizde, yapılandırma bilgileri çalıştırma ayarları dosyasından okunur.
İpucu
Testleri çalıştırdığınızda veya kodunuzu güncelleştirdiğinizde önceki kod kapsamı sonuçları ve kod renklendirmeleri otomatik olarak gizlenmiyor.
Özel ayarları kapatıp açmak için Test et, Çalıştır Ayarlar Yapılandır'ı seçin ve dosya adının seçimini kaldırın veya seçin.
Sembol arama yolları
Kod kapsamı, derlemeler için sembol dosyaları (.pdb dosyaları) gerektirir. Çözümünüz tarafından oluşturulan derlemeler için, simge dosyaları genellikle ikili dosyaların yanında bulunur ve kod kapsamı otomatik olarak çalışır. Bazı durumlarda, kod kapsamı analizinize başvuruda bulunılan derlemeleri dahil etmek isteyebilirsiniz. Böyle durumlarda, .pdb dosyaları ikili dosyalara bitişik olmayabilir, ancak .runsettings dosyasında sembol arama yolunu belirtebilirsiniz.
<SymbolSearchPaths>
<Path>\\mybuildshare\builds\ProjectX</Path>
<!--More paths if required-->
</SymbolSearchPaths>
Not
Özellikle çok sayıda derleme içeren uzak bir dosya konumu kullanılırken sembol çözünürlüğü zaman alabilir. Bu nedenle, .pdb dosyalarını ikili (.dll ve .exe) dosyalarıyla aynı yerel konuma kopyalamayı göz önünde bulundurun.
Derlemeleri ve üyeleri dahil etme veya hariç tutma
Derlemeleri veya belirli türleri ve üyeleri kod kapsamı analizine dahil edebilir veya hariç tutabilirsiniz. Ekle bölümü boşsa veya atlanırsa, yüklenen ve ilişkili PDB dosyalarına sahip tüm derlemeler eklenir. Bir derleme veya üye Dışla bölümündeki bir yan tümceyle eşleşiyorsa, kod kapsamının dışında tutulur. Dışla bölümü Dahil Et bölümünden önceliklidir: Derleme hem Dahil Et hem de Dışla bölümünde listeleniyorsa, kod kapsamına dahil edilmeyecektir.
Örneğin, aşağıdaki XML adını belirterek tek bir derlemeyi dışlar:
<ModulePaths>
<Exclude>
<ModulePath>.*Fabrikam.Math.UnitTest.dll</ModulePath>
<!-- Add more ModulePath nodes here. -->
</Exclude>
</ModulePaths>
Aşağıdaki örnek, kod kapsamına yalnızca tek bir derlemenin dahil edilmesi gerektiğini belirtir:
<ModulePaths>
<Include>
<ModulePath>.*Fabrikam.Math.dll</ModulePath>
<!-- Add more ModulePath nodes here. -->
</Include>
</ModulePaths>
Aşağıdaki tabloda derlemelerin ve üyelerin kod kapsamına eklenmesi veya kod kapsamı dışında tutulması için eşleştirilebileceği çeşitli yollar gösterilmektedir.
XML öğesi | Neyle eşleşir? |
---|---|
ModulePath | Derleme adı veya dosya yolu tarafından belirtilen derlemelerle eşleşir. |
CompanyName | Derlemeleri Şirket özniteliğine göre eşleştirir. |
Publickeytoken | Ortak anahtar belirtecinin imzalı derlemeleriyle eşleşir. |
Source | Öğeleri tanımlandıkları kaynak dosyanın yol adına göre eşleştirir. |
Öznitelik | Belirtilen özniteliğe sahip öğelerle eşleşir. Özniteliğin tam adını belirtin, örneğin <Attribute>^System\.Diagnostics\.DebuggerHiddenAttribute$</Attribute> .özniteliğini CompilerGeneratedAttribute dışlarsanız, , await , yield return ve otomatik uygulanan özellikler gibi async dil özelliklerini kullanan kod kod kapsamı çözümlemesinin dışında tutulur. Gerçekten oluşturulmuş kodu dışlamak için yalnızca özniteliğini dışlayın GeneratedCodeAttribute . |
İşlev | Yordamları, işlevleri veya yöntemleri parametre listesi de dahil olmak üzere tam ada göre eşleştirir. Normal bir ifade kullanarak adın bir bölümünü de eşleştirebilirsiniz. Örnekler: Fabrikam.Math.LocalMath.SquareRoot(double); (C#)Fabrikam::Math::LocalMath::SquareRoot(double) (C++) |
Kod kapsamı biçimleri
Varsayılan olarak kod kapsamı toplanır ve bir .coverage
dosyaya kaydedilir. Xml ve Cobertura gibi diğer biçimleri kullanarak da kapsam toplayabilirsiniz. Farklı düzenleyicilerde ve işlem hatlarında farklı biçimler yararlı olabilir. Bunu runsettings dosyanızdaki DataCollector yapılandırması bölümüne ekleyerek veya <Format>Xml</Format>
ekleyerek <Format>Cobertura</Format>
runsettings'te etkinleştirebilirsiniz. Bu biçim, Visual Studio Enterprise'daki kod kapsamı sonuçları penceresinde görüntülenebilir.
Ayrıca, komut satırından farklı biçimleri runsettings dosyasında belirterek veya bir parametrede belirterek de belirtebilirsiniz. Örneğin, dotnet komut satırı kullanır dotnet test --collect:"Code Coverage;Format=Cobertura"
. vstest için kullanın vstest.console.exe /collect:"Code Coverage;Format=Cobertura"
. collect parametresi, runsettings içinde belirtilen biçimi geçersiz kılar.
Statik ve dinamik yerel izleme
Visual Studio 2022 sürüm 17.2'de yerel ikiliyi statik olarak (diskte) izleme seçeneğini ekledik. Önceki sürümlerde, yalnızca genellikle izleme yöntemleri yapamayacak olan dinamik izlemeleri destekledik. Statik yerel izleme daha kararlıdır ve önerilir. Statik yerel izleme, kod kapsamı koleksiyonuna ihtiyacınız olan tüm yerel projeler için /PROFILE bağlantı seçeneğinin etkinleştirilmesini gerektirir.
Araçlar Seçenekleri Ortam Önizleme Özellikleri'nde önizleme özelliği Kod Kapsamı yerel statik izlemesini etkinleştirerek yerel statik izlemeyi etkinleştirebilirsiniz.> > >
Ayrıca, etiket altına <CodeCoverage>
ekleyerek <EnableStaticNativeInstrumentation>True</EnableStaticNativeInstrumentation>
runsettings içinde yerel statik izlemeyi etkinleştirebilirsiniz. Komut satırı senaryoları için bu yöntemi kullanın.
Varsayılan olarak, dinamik yerel izleme her zaman etkindir. Hem statik hem de dinamik izleme etkinse, Visual Studio C++ kodunuzu statik olarak izlemeye çalışır, ancak bu mümkün değilse (örneğin, bağlantı seçeneği etkinleştirilmediğinde /PROFILE
), dinamik izleme kullanılır. altına <CodeCoverage>
ekleyerek <EnableDynamicNativeInstrumentation>False</EnableDynamicNativeInstrumentation>
runsettings içinde dinamik yerel izlemeyi tamamen devre dışı bırakabilirsiniz.
Statik yerel izleme etkinleştirildiğinde, test yürütmeden önce diskte yerel ikili dosyalar izlenir ve değiştirilir. Özgün ikili dosyalar test yürütmeden sonra geri yüklenir. Etiketin altına ekleyerek <EnableStaticNativeInstrumentationRestore>False</EnableStaticNativeInstrumentationRestore>
runsettings içindeki özgün dosyaların geri yüklenmesini <CodeCoverage>
devre dışı bırakabilirsiniz. Bu özellikle CI senaryolarında yararlı olabilir.
Statik yerel izleme etkinleştirildiğinde Visual Studio, test ikili dosyasının bulunduğu dizindeki tüm yerel ikili dosyaları arar ve izler. İkili dosyaların aranacağı ek dizinler belirtebilirsiniz. Aşağıdaki örnek, ile Fabrikam.Math.dll
biten dosyalar dışında ve alt dizinlerindeki C:\temp
tüm yerel ikili dosyaların izlenmesi gerektiğini belirtir.
<ModulePaths>
<IncludeDirectories>
<Directory Recursive="true">C:\temp</Directory>
</IncludeDirectories>
<Exclude>
<ModulePath>.*Fabrikam.Math.dll</ModulePath>
</Exclude>
</ModulePaths>
Normal ifadeler
Dahil etme ve hariç tutma düğümleri, joker karakterlerle aynı olmayan normal ifadeler kullanır. Tüm eşlemeler büyük/küçük harf duyarsızdır. Aşağıda bazı örnekler bulunmaktadır:
.* herhangi bir karakter dizesiyle eşleşir
\. nokta "" ile eşleşir.
\( \) parantez "( )" ile eşleşir
\\ dosya yolu sınırlayıcısı "\" ile eşleşir
^ dizenin başlangıcıyla eşleşir
$ dizenin sonuyla eşleşir
Aşağıdaki XML, normal ifadeler kullanarak belirli derlemelerin nasıl dahil ve dışlandığını gösterir:
<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>
Aşağıdaki XML, normal ifadeleri kullanarak belirli işlevlerin nasıl dahil ve dışlandığını gösterir:
<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>
Uyarı
Normal ifadede sıralanmamış veya eşleşmeyen parantez gibi bir hata varsa kod kapsamı analizi çalışmaz.
Normal ifadeler hakkında daha fazla bilgi için bkz . Visual Studio'da normal ifadeleri kullanma.
Örnek .runsettings dosyası
Bu kodu kopyalayın ve gereksinimlerinize uyacak şekilde düzenleyin.
<?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>
<!-- 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>