原文 | Youssef Fahmy
翻译 | 郑子铭
今年早些时候,我们宣布所有主流 .NET 测试框架现已支持 Microsoft.Testing.Platform。下一步合乎逻辑的做法是什么?确保它能与您的 CI/CD 管道无缝协作。今天,我们宣布 Microsoft.Testing.Platform 与 Azure DevOps 全面集成。
Azure DevOps 的新增功能
Azure DevOps 现在通过两项关键改进,为 Microsoft.Testing.Platform 提供一流的支持:
- 使用熟悉的 DotNetCoreCLI 任务运行测试;无需再使用其他变通方法。
- 智能处理测试重试------发布来自重试尝试的多个 TRX 文件,并进行适当的分组和退出代码。
无论您是从 VSTest 迁移过来,还是从零开始使用 Microsoft.Testing.Platform,现在的体验都非常流畅直观。
关于 Microsoft.Testing.Platform
如果您是 Microsoft.Testing.Platform 的新用户,以下是一些可以帮助您快速上手的实用资源:
- 《.NET 测试》概述了 .NET 中使用的测试工具。特别是,它阐明了测试平台和测试框架之间的区别。
- 使用"dotnet test"进行测试解释了"dotnet test"命令可以运行的不同模式。
- Microsoft.Testing.Platform 概述介绍了 Microsoft.Testing.Platform 是什么以及如何使用它运行测试。
- 使用新的 dotnet test 增强您的 CLI 测试工作流程,该测试显示了 .NET 10 SDK 中添加的对 Microsoft.Testing.Platform 的"dotnet test"支持。
简而言之,Microsoft.Testing.Platform 是 VSTest 的现代替代方案。
在 Azure DevOps 中运行测试
从 2.263.0 版本开始,DotNetCoreCLI 任务现在支持 Microsoft.Testing.Platform!
在 Azure DevOps 中使用 Microsoft.Testing.Platform 运行测试主要有两种选择:
选项 1:使用 DotNetCoreCLI 任务(推荐)
从版本 2.263.0 开始,DotNetCoreCLI Azure DevOps 任务现在支持Microsoft.Testing.Platform 。
- task: DotNetCoreCLI@2
displayName: 'Run tests'
inputs:
command: 'test'
projects: '**/*Tests.csproj'
arguments: '--no-build --report-trx'
发生了什么变化? Microsoft.Testing.Platform 使用与 VSTest 不同的命令行标志。例如,使用 --report-trx 而不是 --logger trx。有关选项的完整列表,请参阅 Microsoft.Testing.Platform CLI 文档。
选项 2:直接运行"dotnet test"
您可以dotnet test使用脚本或命令行任务直接运行该命令。这样可以最大限度地提高灵活性,并且不需要对 Azure DevOps 任务进行任何特定的更新。
- task: CmdLine@2
displayName: 'Run tests'
inputs:
script: 'dotnet test --no-build --report-trx'
何时使用此方法?如果您需要围绕测试执行编写自定义脚本,或者想要避免对特定任务版本的依赖,请选择此方法。
从 VSTest 任务迁移
VSTest Azure DevOps 任务是专门为 VSTest 设计的,不支持 Microsoft.Testing.Platform。
如果您当前正在使用 VSTest 任务:
- 切换到选项 1(DotNetCoreCLI 任务)可获得最相似的体验。
- 请将命令行参数更新为使用 Microsoft.Testing.Platform 语法
- 测试您的管道,以确保测试发现和执行按预期工作。
选项 1 和选项 2 都提供了与 VSTest 任务相同的测试执行功能。
发布支持重试的测试结果
问题在于:当您使用Retry 扩展程序自动重新运行失败的测试时,Microsoft.Testing.Platform 会为每次尝试生成一个单独的 TRX 文件。以前,该PublishTestResults任务会将这些 TRX 文件视为独立的测试运行,从而导致两个问题:
- 退出代码错误:即使重试后测试最终通过,任务仍然会失败。
- 用户界面令人困惑:测试结果显示为单独的运行结果,而不是分组的重试尝试结果。
我们已经解决了这个问题!PublishTestResults现在,该任务可以智能地处理来自重试尝试的多个 TRX 文件,正确地对它们进行分组并设置适当的退出代码。
你需要知道
Microsoft.Testing.Platform 通过Microsoft.Testing.Extensions.TrxReport包使用标准 TRX 格式(也称为 VSTest 测试结果格式)。PublishTestResults任务一直支持 TRX 文件。新增功能是对重试场景的智能处理。
所需配置
要启用重试感知测试结果发布功能,请在管道中设置该AllowPtrToDetectTestRunRetryFiles变量true。此选项启用新行为后,系统会将多个 TRX 文件正确解释为重试尝试,而不是单独的测试运行。
重要提示:此变量必须在管道级别设置(在您的 YAML 文件或管道变量中)。如果在项目或组织级别设置,则无效。
完整的管道示例
以下是一个完整的测试流程,演示了如何执行测试、重试以及如何正确发布结果:
trigger:
- main
jobs:
- job: MyJob
variables:
AllowPtrToDetectTestRunRetryFiles: true
steps:
# Your usual steps to install .NET SDK, restore, and build.
- task: CmdLine@2
displayName: 'Run tests'
inputs:
script: 'dotnet test --no-build --report-trx --retry-failed-tests 3 --results-directory TestResults'
- task: PublishTestResults@2
displayName: 'Publish test results'
inputs:
testResultsFormat: 'VSTest'
testResultsFiles: '**/*.trx'
mergeTestResults: true
failTaskOnFailedTests: true
condition: succeededOrFailed()
该流程的关键点:
- 该AllowPtrToDetectTestRunRetryFiles: true变量启用重试感知行为
- 该--retry-failed-tests 3标志指示测试平台重试失败的测试最多 3 次。
- condition: succeededOrFailed()即使测试失败,也能确保测试结果发布。
了解重试结果
让我们看看 Azure DevOps UI 如何显示不同重试场景下的结果。假设有一个测试套件,其中包含一个始终通过的稳定测试和一个间歇性失败的不稳定测试。
场景 1:所有测试均一次性通过
所有测试立即通过时,您会看到标准的成功指示器。PublishTestResults任务成功完成。
场景 2:重试后测试通过
这就是新行为的优势所在。用户界面显示测试在前两次尝试中失败,但在第三次尝试中成功。尽管最初出现了失败,但PublishTestResults由于测试最终成功,任务仍然通过。这才是处理不稳定测试的正确做法。
场景 3:测试在所有重试尝试中均失败
如果测试在所有尝试中均失败,用户界面会将所有失败项分组显示,以便于查看。您可以检查每个单独的失败项,以识别模式或差异。PublishTestResults当条件为真时,任务会按预期失败failTaskOnFailedTests。
为什么这很重要
这里需要区分 VSTest 和 Microsoft.Testing.Platform:VSTest 本身没有内置的重试支持,因此这种情况不会自然发生。而 Microsoft.Testing.Platform 的重试扩展则提供了自动重试处理功能,并与 Azure DevOps 完美集成;无需编写任何自定义脚本。
立即开始
Azure DevOps 现在全面支持 Microsoft.Testing.Platform------从运行测试到发布重试结果并进行智能处理。
准备迁移?
- 更新至 .NET SDK 10
- 将 Retry 扩展添加到您的测试项目中
- AllowPtrToDetectTestRunRetryFiles: true在您的管道中设置
- --retry-failed-tests使用标志运行测试
需要帮助吗?我们随时为您服务:
- 提问:GitHub 讨论区
- 报告问题:GitHub Issues
- 了解更多信息:Microsoft.Testing.Platform 文档
原文链接
Microsoft.Testing.Platform Now Fully Supported in Azure DevOps
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
欢迎转载、使用、重新发布,但务必保留文章署名 郑子铭 (包含链接: http://www.cnblogs.com/MingsonZheng/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
如有任何疑问,请与我联系 (MingsonZheng@outlook.com)