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. ne kadar kodun test edilmiş olduğunu belirlemek için kod kapsamını kullanma.
Test kodunu kod kapsamı sonuçlarından dışlamak ve yalnızca uygulama kodunu eklemek için test sınıfınıza ExcludeFromCodeCoverageAttribute özniteliğini 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.
Not
Kod kapsamı yalnızca Visual Studio Enterprise ile kullanılabilir. .NET kod kapsamı için alternatif olarak dotnet-coverage komut satırı aracını kullanabilirsiniz.
Ç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ı .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ünüzün kısayol menüsünde Çözüm Gezgini>seçin ve XML Dosyasıöğesini seçin. dosyayı CodeCoverage.runsettingsgibi bir adla kaydedin.
Tüm öğe şablonlarını görmüyorsanız, Tüm Şablonları Gösteröğesini 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ını Yapılandırseçin ve ardından Solution Wide çalıştırma ayarları dosyasını 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ı analiz seçtiğinizde, yapılandırma bilgileri çalıştırma ayarları dosyasından okunur.
Bahşiş
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ı açmak veya kapatmak için Test menüsünde dosyanın seçimini seçin veya kaldırın.
Çalıştırma ayarları dosyasını seçmek için, Test menüsünde Ayarlar Dosyasını Seçseçeneğini 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ı analiz seçtiğinizde, yapılandırma bilgileri çalıştırma ayarları dosyasından okunur.
Bahşiş
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, Çalıştırma Ayarlarını Yapılandır'ü seçin ve dosya adını seçin veya seçimini kaldırın.
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. Bu gibi 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. dahil 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. |
Şirket Adı | Company özelliğine göre derlemeleri eşleştirir. |
PublicKeyToken | İmzalı derlemeleri ortak anahtar belirteciyle eşleştirir. |
Kaynak | Öğ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> .CompilerGeneratedAttribute özniteliğini dışlarsanız, async , await , yield return ve otomatik uygulanan özellikler gibi dil özelliklerini kullanan kod, kod kapsamı çözümlemesinin dışında tutulur. Gerçekten oluşturulmuş kodu dışlamak için yalnızca GeneratedCodeAttribute özniteliğini hariç tutun. |
Fonksiyon | Fonksiyonları, işlevleri veya yöntemleri, parametre listesi de dahil olmak üzere tam nitelikli adına göre eşleştirir. Ayrıca, bir normal ifade kullanarak adın bir bölümünü 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
dosyasına 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. Runsettings dosyanızın <Format>Cobertura</Format>
DataCollector yapılandırması bölümüne <Format>Xml</Format>
veya ekleyerek bunu 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ı dotnet test --collect:"Code Coverage;Format=Cobertura"
kullanır. vstest için vstest.console.exe /collect:"Code Coverage;Format=Cobertura"
kullanın. collect parametresi, runsettings içinde belirtilen biçimi geçersiz kılar.
Statik ve dinamik yerel enstrümantasyon
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 yöntemleri izleyip analiz edemeyen dinamik enstrümantasyonu destekledik. Statik yerel araç kullanımı daha kararlıdır ve tavsiye edilir. Statik yerel araç oluşturma, kod kapsamı toplamanız gereken tüm yerel projeler için /PROFILE bağlantı seçeneğinin etkinleştirilmesini gerektirir.
Ayrıca, <EnableStaticNativeInstrumentation>True</EnableStaticNativeInstrumentation>
etiketi altına <CodeCoverage>
ekleyerek runsettings dosyasında yerel statik enstrümantasyonu etkinleştirebilirsiniz. Komut satırı senaryoları için bu yöntemi kullanın.
Varsayılan olarak, dinamik yerel izleme araçları 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, /PROFILE
bağlantı seçeneği etkinleştirilmediğinde), dinamik izleme kullanılır.
<EnableDynamicNativeInstrumentation>False</EnableDynamicNativeInstrumentation>
altına <CodeCoverage>
ekleyerek runsettings ayarlarında dinamik yerel izlemeyi tamamen devre dışı bırakabilirsiniz.
Statik yerel araçlama etkinleştirildiğinde, test yürütülmeden önce diskteki yerel ikili dosyalar üzerinde araçlama yapılır ve değiştirilir. Özgün binar dosyalar, test yürütme işlemi tamamlandıktan sonra geri yüklenecektir.
<EnableStaticNativeInstrumentationRestore>False</EnableStaticNativeInstrumentationRestore>
etiketinin altına <CodeCoverage>
ekleyerek runsettings içindeki özgün dosyaların geri yüklenmesini devre dışı bırakabilirsiniz. Bu özellikle CI senaryolarında yararlı olabilir.
Statik yerel izleme araçları 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, C:\temp
ile biten dosyalar dışında Fabrikam.Math.dll
ve alt dizinlerindeki tüm yerel ikili dosyaların enstrümante edilmesi 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şleşmeler büyük/küçük harf farkı gözetmez. Bazı örnekler şunlardır:
.* herhangi bir karakterden oluşan bir dizeyle eşleşir
\. nokta '.' ile eşleşir.
\( \) "( )" parantezleriyle 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>
<Format>coverage</Format>
<!--
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>