Rob*_*abe 6 .net c# testing code-coverage cobertura
我有一个包含两个dotnet核心2.1项目(c#)的解决方案.
第一个是控制台应用程序
秒是一个带有单元测试的测试项目
我使用此命令在项目2中执行测试时生成有关项目1的代码覆盖率统计信息:
dotnet test C:\tempDir\SampleApp\Tests\SampleApp.Tests.csproj
/p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
/p:CoverletOutput=C:\tempDir\Coverage\coverage
/p:settings=CodeCoverage.runsettings --filter Category=Unit --logger trx
--results-directory C:\tempDir\output
Run Code Online (Sandbox Code Playgroud)
你可以在这里看到我指定CodeCoverage.runsettings作为设置参数 - /p:settings=CodeCoverage.runsettings.在我的运行设置文件中,我已经询问Program.cs并将Startup.cs其从coverage中排除,但它们仍包含在输出coverage.cobertura.xml文件中.
从以下输出报告中提取:
<classes>
<class name="SampleApp.Startup" filename="SampleApp\Startup.cs" line-rate="1" branch-rate="0" complexity="2">
<methods>
<method name="ConfigureAppConfiguration" signature="(Microsoft.Extensions.Configuration.IConfigurationBuilder)" line-rate="1" branch-rate="0">
<lines>
<line number="18" hits="1" branch="False" />
<line number="19" hits="1" branch="False" />
<line number="20" hits="1" branch="False" />
</lines>
</method>
<method name="ConfigureLogging" signature="(Microsoft.Extensions.Configuration.IConfiguration,Microsoft.Extensions.Logging.ILoggingBuilder)" line-rate="1" branch-rate="0">
<lines>
<line number="23" hits="1" branch="False" />
<line number="24" hits="1" branch="False" />
<line number="25" hits="1" branch="False" />
<line number="26" hits="1" branch="False" />
<line number="27" hits="1" branch="False" />
</lines>
</method>
</methods>
<lines>
<line number="18" hits="1" branch="False" />
<line number="19" hits="1" branch="False" />
<line number="20" hits="1" branch="False" />
<line number="23" hits="1" branch="False" />
<line number="24" hits="1" branch="False" />
<line number="25" hits="1" branch="False" />
<line number="26" hits="1" branch="False" />
<line number="27" hits="1" branch="False" />
</lines>
</class>
</classes>
Run Code Online (Sandbox Code Playgroud)
我想知道我在runsettings档案中做错了什么?(以下文件的内容)
<?xml version="1.0" encoding="utf-8"?>
<RunSettings>
<!-- Configurations for data collectors -->
<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>
<ModulePath>.*dll$</ModulePath>
</Include>
<Exclude>
<ModulePath>.*microsoft.*</ModulePath>
<ModulePath>.*moq.*</ModulePath>
<ModulePath>.*polly.*</ModulePath>
<ModulePath>.*fluentassertions.*</ModulePath>
<ModulePath>.*newtonsoft.*</ModulePath>
<ModulePath>.*SampleApp.Tests.*</ModulePath>
<ModulePath>.*\\[^\\]*DocumentManagement[^\\]*\.dll</ModulePath>
</Exclude>
</ModulePaths>
<Functions>
<Exclude>
<Function>.*\.Program\..*</Function>
<Function>.*\.Startup\..*</Function>
<Function>.*\.SomeOtherClass\..*</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>
<!-- We recommend you do not change the following values: -->
<UseVerifiableInstrumentation>True</UseVerifiableInstrumentation>
<AllowLowIntegrityProcesses>True</AllowLowIntegrityProcesses>
<CollectFromChildProcesses>True</CollectFromChildProcesses>
<CollectAspDotNet>False</CollectAspDotNet>
</CodeCoverage>
</Configuration>
</DataCollector>
</DataCollectors>
</DataCollectionRunSettings>
</RunSettings>
Run Code Online (Sandbox Code Playgroud)
当我指定在runsettings文件中跳过此部分时,不确定为什么此部分仍在此输出报告中.
注意:我试图避免使用[ExcludeFromCodeCoverage]属性乱丢我的代码,我不想在构建中开始添加/p:ExcludeByFile=Program.cs或/p:ExcludeByFile=Startup.cs测试命令,因此使用runsettings文件.
您不能仅通过提供类名来使用运行设置文件排除类。
运行设置中的 Function 元素与函数/方法的全名匹配,例如
YourNamespace.YourClass.Method(参数);
文档中只能进行以下设置:
包含或排除元素的其他方法 ModulePath - 匹配程序集文件路径指定的程序集。
CompanyName - 按公司属性匹配程序集。
PublicKeyToken - 通过公钥令牌匹配签名的程序集。
源- 通过定义元素的源文件的路径名来匹配元素。
属性- 匹配附加特定属性的元素。指定属性的完整名称,并在名称末尾包含“属性”。
函数- 按完全限定名称匹配过程、函数或方法。要匹配函数名称,正则表达式必须匹配函数的完全限定名称,包括命名空间、类名称、方法名称和参数列表。
您有什么选择:
选项 1:使用以 OR 开头 使用方法名称
<Functions>
<Exclude>
<!-- Exclude all methods in SampleApp.Program : -->
<Function>^SampleApp\.Program\..*</Function>
<!-- Exclude all methods named Main: -->
<Function>.*\.Main\(.*</Function>
</Exclude>
</Functions>
Run Code Online (Sandbox Code Playgroud)
在第一个函数中,请注意,指定了带有类名的命名空间,并且它以 ^ 字符开头。
在第二个函数元素中,请注意,它通过检查字符串是否以左括号“(”结尾来检查方法名称。
选项 2:您可以使用类的属性并将它们从运行设置文件中排除。
这与 ExcludeFromCodeCoverate 属性类似。
请注意本文档页面末尾的完整运行设置文件。