如何通过一次调用 "dotnet test" 正确生成 TRX 文件和代码覆盖率结果?
How can I properly generate both TRX files and code coverage results with one call to "dotnet test"?
首先,一些上下文:我有一个 Visual Studio 解决方案,其中包含几个生产 class 库和九个单元测试项目。所有项目都以 .NET 5 为目标。我正在 运行ning .NET 5.0.401。所有单元测试项目都引用了 coverlet.collector
。我不使用旧的 coverlet.msbuild
包。根据我的阅读,使用 XPlat Code Coverage
现在是 .NET Core 的惯用语。
我有一个用于 CI 构建的 Azure Pipelines 管道。作为这个流水线的一部分,我想 运行 所有单元测试,生成单元测试结果上传到流水线,生成代码覆盖率结果上传到流水线。我已经阅读了几篇博客文章和文档,这些文章和文档似乎 使这个变得简单;然而,我发现它根本不是。
让我们从简单的 运行 在我的本地工作站上执行一些命令开始。出于本练习的目的,我们假设我已经使用以下命令成功构建了解决方案:
dotnet build Solution.sln --configuration Debug
如果我运行这样测试:
dotnet test Solution.sln --configuration Debug --no-build --no-restore --collect:"XPlat Code Coverage" --results-directory artifacts/test-results
然后我看到代码覆盖率结果存储在以 GUID 命名的子目录中。为什么 Microsoft 决定这样做我不知道,但这是我无法控制的。
(运行执行此命令并截屏后,我删除了 test-results
目录。)
请记住,我还想生成单元测试结果。为此,我将 --logger trx
参数添加到同一命令行。这一次,创建了许多其他文件夹,其中包含看似重复的代码覆盖率结果。此外,我得到了我正在寻找的 .trx
个文件。
您会注意到,除了我想要的九个 .trx
文件之外,还有另外九个代码覆盖率报告。
在我的自托管管道生成代理上生成了类似的重复文件。在管道中,如果我尝试执行以下任务:
- task: 'PublishCodeCoverageResults@1'
displayName: 'Publish code coverage results'
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: 'artifacts/test-results/**/coverage.cobertura.xml'
我得到一个错误:
##[warning]Multiple file or directory matches were found. Using the first match: C:\agent\_work\s\artifacts\test-results$redacted\In\redacted\coverage.cobertura.xml
##[error]No code coverage results were found to publish.
它在此处报告的目录不是我省略 --logger trx
时生成的 GUID 目录之一,而是重复目录之一。
似乎表明我做的一切都正确。我还对该答案发表了评论,希望得到一些帮助。
我有几个问题:
- 我是否正确调用了
dotnet test
以便同时生成代码覆盖率结果和 .trx
文件?
dotnet test
支持这种场景吗?
- Azure Pipelines 市场中
ReportGenerator
扩展的功能现在真的内置到 dotnet
中了吗?
- 哪些代码覆盖率结果是“真实”的?在发布代码覆盖率结果之前,我是否需要将 GUID 文件夹复制到另一个位置?
- 我想指定一个 RunSettings 文件,以便执行一些操作,例如将具有某些属性的成员排除在代码覆盖率引擎的考虑之外。 RunSettings 与我的工作流程兼容吗?
如果您有多个覆盖文件,您需要先合并它们,然后再发布。您可以通过以下方式实现此目的:
- task: DotNetCoreCLI@2
displayName: "dotnet test"
inputs:
command: test
projects: "*.sln"
publishTestResults: true
arguments: -c Release --no-restore --no-build /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
- task: reportgenerator@4
displayName: "Merge code coverage reports"
inputs:
reports: "**/coverage.cobertura.xml"
targetdir: "$(Build.ArtifactStagingDirectory)/coverlet"
reporttypes: "Cobertura"
verbosity: "Verbose"
- task: PublishCodeCoverageResults@1
displayName: "Publish code coverage results"
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: "$(Build.ArtifactStagingDirectory)/coverlet/Cobertura.xml"
注意:一些参数可能需要根据您的项目进行调整(例如您希望包含 cobertura 文件的目录)。
我的代码中没有 trx 的特定记录器,我在日志中看到它们已生成。
如果您想通过运行设置,请检查此 doc - Configure a test run。
首先,一些上下文:我有一个 Visual Studio 解决方案,其中包含几个生产 class 库和九个单元测试项目。所有项目都以 .NET 5 为目标。我正在 运行ning .NET 5.0.401。所有单元测试项目都引用了 coverlet.collector
。我不使用旧的 coverlet.msbuild
包。根据我的阅读,使用 XPlat Code Coverage
现在是 .NET Core 的惯用语。
我有一个用于 CI 构建的 Azure Pipelines 管道。作为这个流水线的一部分,我想 运行 所有单元测试,生成单元测试结果上传到流水线,生成代码覆盖率结果上传到流水线。我已经阅读了几篇博客文章和文档,这些文章和文档似乎 使这个变得简单;然而,我发现它根本不是。
让我们从简单的 运行 在我的本地工作站上执行一些命令开始。出于本练习的目的,我们假设我已经使用以下命令成功构建了解决方案:
dotnet build Solution.sln --configuration Debug
如果我运行这样测试:
dotnet test Solution.sln --configuration Debug --no-build --no-restore --collect:"XPlat Code Coverage" --results-directory artifacts/test-results
然后我看到代码覆盖率结果存储在以 GUID 命名的子目录中。为什么 Microsoft 决定这样做我不知道,但这是我无法控制的。
(运行执行此命令并截屏后,我删除了 test-results
目录。)
请记住,我还想生成单元测试结果。为此,我将 --logger trx
参数添加到同一命令行。这一次,创建了许多其他文件夹,其中包含看似重复的代码覆盖率结果。此外,我得到了我正在寻找的 .trx
个文件。
您会注意到,除了我想要的九个 .trx
文件之外,还有另外九个代码覆盖率报告。
在我的自托管管道生成代理上生成了类似的重复文件。在管道中,如果我尝试执行以下任务:
- task: 'PublishCodeCoverageResults@1'
displayName: 'Publish code coverage results'
inputs:
codeCoverageTool: 'Cobertura'
summaryFileLocation: 'artifacts/test-results/**/coverage.cobertura.xml'
我得到一个错误:
##[warning]Multiple file or directory matches were found. Using the first match: C:\agent\_work\s\artifacts\test-results$redacted\In\redacted\coverage.cobertura.xml
##[error]No code coverage results were found to publish.
它在此处报告的目录不是我省略 --logger trx
时生成的 GUID 目录之一,而是重复目录之一。
我有几个问题:
- 我是否正确调用了
dotnet test
以便同时生成代码覆盖率结果和.trx
文件? dotnet test
支持这种场景吗?- Azure Pipelines 市场中
ReportGenerator
扩展的功能现在真的内置到dotnet
中了吗? - 哪些代码覆盖率结果是“真实”的?在发布代码覆盖率结果之前,我是否需要将 GUID 文件夹复制到另一个位置?
- 我想指定一个 RunSettings 文件,以便执行一些操作,例如将具有某些属性的成员排除在代码覆盖率引擎的考虑之外。 RunSettings 与我的工作流程兼容吗?
如果您有多个覆盖文件,您需要先合并它们,然后再发布。您可以通过以下方式实现此目的:
- task: DotNetCoreCLI@2
displayName: "dotnet test"
inputs:
command: test
projects: "*.sln"
publishTestResults: true
arguments: -c Release --no-restore --no-build /p:CollectCoverage=true /p:CoverletOutputFormat=cobertura
- task: reportgenerator@4
displayName: "Merge code coverage reports"
inputs:
reports: "**/coverage.cobertura.xml"
targetdir: "$(Build.ArtifactStagingDirectory)/coverlet"
reporttypes: "Cobertura"
verbosity: "Verbose"
- task: PublishCodeCoverageResults@1
displayName: "Publish code coverage results"
inputs:
codeCoverageTool: Cobertura
summaryFileLocation: "$(Build.ArtifactStagingDirectory)/coverlet/Cobertura.xml"
注意:一些参数可能需要根据您的项目进行调整(例如您希望包含 cobertura 文件的目录)。
我的代码中没有 trx 的特定记录器,我在日志中看到它们已生成。
如果您想通过运行设置,请检查此 doc - Configure a test run。