使用 Cake

问题描述

目前,我为解决方案中的每个文本项目运行 DotCover。 我想将其更改为仅对整个解决方案运行一次 DotCover。

我发现这个命令有效:

C:\_git\MyApp\build\tools\JetBrains.dotCover.CommandLineTools.2021.1.3\tools\dotCover.exe dotnet --output=C:\Temp\report.xml --reporttype=xml -- test "C:\_git\MyApp\MyApp.sln"

我的构建脚本是用 Cake 编写的,我喜欢在 Cake 中执行这个命令。 但是,在线我只能找到为这样的单个测试项目运行 DotCover 的方法:

var dotCoverCoverSettings = new DotCoverCoverSettings();
dotCoverCoverSettings.WithAttributeFilter( "System.Diagnostics.CodeAnalysis.ExcludeFromCodeCoverageAttribute" );

DotCoverCover( tool => {
  tool.DotNetCoreTest(
    "test. dll",new DotNetCoreTestSettings() {                    
      Configuration = configuration
    }
  );
  },"out.xml",dotCoverCoverSettings
);

Cake 中是否有使用解决方案文件的 dotnet test 运行第一个 DotCover 命令的方法?

我知道 StartProcess,但我更喜欢使用特定方法来运行 DotCover。 如果 StartProcess 是唯一的选择,是否有内置的方法来解析 cake 下载的 dotCover exe(NuGet 包 #tool nuget:?package=JetBrains.dotCover.CommandLineTools)的路径?

StartProcess(
@"C:\_git\MyApp\build\tools\JetBrains.dotCover.CommandLineTools.2021.1.3\tools\dotCover.exe",new ProcessSettings {
    Arguments = new ProcessArgumentBuilder()
        .Append( "dotnet" )
        .Append( @"--output=C:\Temp\report.dotCover.dcvr" )
        .Append( "--reporttype=XML" )
        .Append( @"-- test ""C:\_git\MyApp\MyApp.sln""" )
    }
);

编辑:

正如@Nils 所建议的那样;将解决方案文件作为参数传递给 DotNetCoreTest 有效。但是 DotCover 在使用此代码调用时“随机”冻结:

DotCoverCover( tool => {
    tool.DotNetCoreTest(
      Paths.SolutionFilePath.ToString(),new DotNetCoreTestSettings() {                    
        Configuration = configuration,NoBuild = true,NoRestore = true
      }
    );
    },dotCoverOutputFileName,dotCoverCoverSettings
);

它会打印一些测试项目的结果,然后什么都没有...

Passed!  - Failed:     0,Passed:    51,Skipped:     0,Total:    51,Duration: 220 ms - Proj1.Test.dll (net5.0)
Passed!  - Failed:     0,Passed:    26,Total:    26,Duration: 247 ms - Proj2.Test.dll (net5.0)
Passed!  - Failed:     0,Passed:    28,Total:    28,Duration: 249 ms - Proj3.Test.dll (net5.0)
Passed!  - Failed:     0,Passed:    31,Total:    31,Duration: 123 ms - Proj4.Test.dll (net5.0)
Passed!  - Failed:     0,Passed:   124,Total:   124,Duration: 3 s - Proj5.Test.dll (net5.0)
Passed!  - Failed:     0,Passed:   660,Total:   660,Duration: 5 s - Proj6.Test.dll (net5.0)

问题可能在于 Cake 使用其他参数来运行 DotCover:

C:/_git/MyApp/build/tools/JetBrains.dotCover.CommandLineTools.2021.1.3/tools/dotCover.exe Cover /TargetExecutable="C:/Program Files/dotnet/dotnet.exe" /TargetArguments="test \"../MyApp.sln\" --configuration Release --no-build --no-restore" /Output="C:/Temp/MyApp.sln.dotCover.dcvr"

JetBrains“推荐”的参数 (https://youtrack.jetbrains.com/issue/DCVR-9681)

C:\_git\MyApp\build\tools\JetBrains.dotCover.CommandLineTools.2021.1.3\tools\dotCover.exe dotnet --output=C:\Temp\report.html --reporttype=html -- test "C:\_git\MyApp\MyApp.sln"

我在循环中运行最后一个命令,看看我是否可以重现“冻结问题”,但它确实有效。

解决方法

您是否尝试将解决方案的完整路径设置为 DotNetCoreTest 的第一个参数? (即提供解决方案而不是项目。)

最后,DotNetCoreTester 只是将它作为第一个参数传递给 dotnet test。所以..根据dotnet-test docs可以是[<PROJECT> | <SOLUTION> | <DIRECTORY> | <DLL>]

也许蛋糕上的文档 DotNetCoreAliases 根本不那么准确。

编辑:

虽然 DotNetCoreTester 以解决方案作为参数工作正常,因此能够同时运行多个测试项目,但 dotCover for .NET Framework 测试(即 DotCoverCover 中的调用)不能处理这个。

linked youtrack-issue 中给出的解决方案是使用 dotCover.exe dotnet,即当前未在 Cake 中实现的 dotCover syntax for .NET Core

因此,您似乎看到了三个选项:

  • 使用上面提到的 StartProcess 语法
  • 对多个项目使用 dotCover 方法,as laid out in the documentation:搜索解决方案中的所有测试项目,单独覆盖每个项目,最后运行 DotCoverMerge 以合并报告。
  • 创建一个描述缺失功能的 issue in the Cake project。 (理想情况下,开始制定 PR 以实施它。)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...