【问题标题】:Run DotCover dotnet test with Cake使用 Cake 运行 DotCover dotnet 测试
【发布时间】:2021-09-16 06:49:10
【问题描述】:

目前,我为解决方案中的每个文本项目运行 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 测试对解决方案文件运行第一个 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, Skipped:     0, Total:    26, Duration: 247 ms - Proj2.Test.dll (net5.0)
Passed!  - Failed:     0, Passed:    28, Skipped:     0, Total:    28, Duration: 249 ms - Proj3.Test.dll (net5.0)
Passed!  - Failed:     0, Passed:    31, Skipped:     0, Total:    31, Duration: 123 ms - Proj4.Test.dll (net5.0)
Passed!  - Failed:     0, Passed:   124, Skipped:     0, Total:   124, Duration: 3 s - Proj5.Test.dll (net5.0)
Passed!  - Failed:     0, Passed:   660, Skipped:     0, 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"

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

【问题讨论】:

    标签: c# unit-testing .net-core cakebuild dotcover


    【解决方案1】:

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

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

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

    编辑:

    虽然DotNetCoreTester 可以很好地使用解决方案作为参数,因此能够同时运行多个测试项目,但dotCover for .NET Framework 测试(在DotCoverCover 中调用)无法处理这个问题。

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

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

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

    【讨论】:

    • 我试过这个。它有时有效,但有些运行只是冻结。 DotCover 打印测试项目的结果,然后什么也不打印。在查看 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"
    • 因此,您链接的 youtrack 问题专门讨论了 dotCover.exe dotnet 并且提到的命令行语法不是“最佳实践”,而只是 dotCover.exe dotnet 的语法,而 Cake 中的 DotCoverCover 方法利用dotCover.exe cover 命令。目前,Cake 中的包装器似乎缺少别名 dotCover.exe cover。我相应地修改了我的答案。
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 2016-10-11
    • 2017-06-16
    • 2017-07-22
    • 1970-01-01
    • 1970-01-01
    • 2022-12-14
    • 2018-05-17
    相关资源
    最近更新 更多