问题描述
目前,我为解决方案中的每个文本项目运行 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 以实施它。)