gpt4 book ai didi

c# - dotnet cli - 指定的 .runsettings 文件未在代码覆盖率运行中使用

转载 作者:太空狗 更新时间:2023-10-29 21:59:48 25 4
gpt4 key购买 nike

我有一个包含两个 dotnet core 2.1 项目 (c#) 的解决方案。

  1. 第一个是控制台应用程序

  2. 秒是有单元测试的测试项目

我在使用此命令在项目 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

你可以在这里看到我将 CodeCoverage.runsettings 指定为 settings 参数 - /p:settings=CodeCoverage.runsettings。在我的运行设置文件中,我已要求将 Program.csStartup.cs 排除在覆盖范围之外,但它们仍包含在输出覆盖范围内。 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>

我想知道我在 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>

当我在 runsettings 文件中指定它被跳过时,不确定为什么这个部分仍然在这个输出报告中。

注意:我正在尝试避免使用 [ExcludeFromCodeCoverage] 属性乱写我的代码,并且我不想必须开始添加 /p:ExcludeByFile=Program.cs/p:ExcludeByFile=Startup.cs 到我在构建中的测试命令,因此使用 runsettings 文件。

最佳答案

您不能使用 runsettings 文件排除类 仅提供类名。

运行设置中的 Function 元素匹配函数/方法的全名,例如

YourNamespace.YourClass.Method(参数);

只有以下设置是可能的 from the documentation :

Other ways to include or exclude elements ModulePath - matches assemblies specified by assembly file path.

CompanyName - matches assemblies by the Company attribute.

PublicKeyToken - matches signed assemblies by the public key token.

Source - matches elements by the path name of the source file in which they are defined.

Attribute - matches elements to which a particular attribute is attached. Specify the full name of the attribute, and include "Attribute" at the end of the name.

Function - matches procedures, functions, or methods by fully qualified name. To match a function name, the regular expression must match the fully qualified name of the function, including namespace, class name, method name, and parameter list.

你有什么选择:

选项 1:使用 Starts with OR 使用方法名称

        <Functions>
<Exclude>

<!-- Exclude all methods in SampleApp.Program : -->
<Function>^SampleApp\.Program\..*</Function>

<!-- Exclude all methods named Main: -->
<Function>.*\.Main\(.*</Function>
</Exclude>
</Functions>

在第一个函数中,请注意您指定了带有类名的命名空间,并且它以 ^ 字符开头。

在第二个函数元素中,请注意它通过检查字符串是否以左括号“(”结尾来检查方法名称。

选项 2:您可以在类上使用属性并将它们从运行设置文件中排除。

这类似于 ExcludeFromCodeCoverate 属性。

请注意完整的runsettings file at the end of this documentation page.

关于c# - dotnet cli - 指定的 .runsettings 文件未在代码覆盖率运行中使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54259945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com