每个报表选项都需要其对应章节中指定的扩展包。 直接添加该包,或使用包含该包的测试 SDK 配置或配置文件。 报告扩展不属于 MTP 核心的一部分,因此当测试应用程序未注册相应扩展时,像 --report-trx 这样的选项将无法被识别。 使用 --help 运行测试应用程序,或以 MTP 模式运行 dotnet test --help,以确认某个选项是否可用。
小窍门
使用 Microsoft.Testing.Platform.MSBuild (由 MSTest、NUnit 和 xUnit 运行程序以可传递方式包含)时,这些扩展会在安装其 NuGet 包时自动注册,无需更改代码。 只有在通过设置 <GenerateTestingPlatformEntryPoint>false</GenerateTestingPlatformEntryPoint>禁用自动生成的入口点时,才需要本文中指定的手动注册。
报告文件名称
每个报表扩展都会将其文件写入测试结果目录,可以使用该 --results-directory 选项进行设置。 若要覆盖名称,请使用对应的 --report-*-filename 选项。 每个报表部分列出了该报表的默认名称。
若要在多模块dotnet test运行中隔离具有相同相对文件名的报表,请在--results-directory-layout per-module之前使用 SDK 的--选项。
文件名可以包含保留在测试结果目录中的相对路径,并且可以使用以下替换项(占位符):
| 占位符 | Description |
|---|---|
{asm} |
入口程序集名称,或当它不可用时为 unknown。 |
{tfm} |
在运行时检测到目标框架标识符,例如 net9.0。 |
{arch} |
进程体系结构,例如 x64, x86或 arm64。 |
{pname} |
进程名称。 |
{pid} |
进程 ID。 |
{time} |
高精度时间戳。 |
例如, --report-trx-filename "{asm}_{tfm}_{arch}.trx" 重现默认的 TRX 名称。
如果测试源已存在默认或显式 TRX、HTML 或 JUnit 文件名,则扩展会警告并覆盖该文件。 从 MTP 2.4 开始,CTRF 使用相同的行为。 若要保留报表历史记录,请包括 {time}。
注释
占位符名称区分大小写,且应使用小写字母。 从版本 2.3.0 开始,MTP 中提供了报表文件名的占位符支持。
报表合并
从 MTP 2.4.0 开始,当重试支持执行了多次尝试后,MTP 会自动对报告项目进行后处理。
对于运行多个测试模块的 dotnet test 调用,自动后处理还需要 .NET 11 或更高版本。 此功能在 MTP 2.4.0 中是实验性的。
TRX、JUnit、CTRF 和 HTML 扩展按报表种类对兼容项目进行分组,并在测试结果目录的 merged 子目录下编写合并报表。 CTRF 合并会组合模块结果,并将多次重试折叠到包含重试历史记录的最终测试结果中。 HTML 合并会创建合并的摘要,并保留原始的按进程报告。
对于自定义报表扩展,实验性 IArtifactPostProcessor API 提供了独立的 TestModules 和 RetryAttempts 处理模式。 有关详细信息,请参阅扩展IArtifactPostProcessor。
若要禁用多模块构件后期处理,请将 --no-artifact-post-processing 传递给 dotnet test。
Visual Studio测试报告 (TRX)
Visual Studio测试结果文件(或 TRX)是发布测试结果的默认格式。 此扩展需要 Microsoft.Testing.Extensions.TrxReport NuGet 包。
如果创作测试框架,请实现 ITrxReportCapability 以提供测试类、类别、失败和输出元数据。 仅报表包不会向测试节点添加特定于框架的数据。
手动注册
var builder = await TestApplication.CreateBuilderAsync(args);
builder.AddTrxReportProvider();
注释
在使用手动注册时,请将 TRX 报告提供程序设为最后注册的对象。 当前实现取决于注册顺序,因此在所有其他扩展之后注册它可确保它捕获所有测试数据。
注释
从版本 1.9.0 开始的 MTP 中可用,TRX 报告包括测试 Description 字段。
注释
从版本 2.3.0 开始的 MTP 中可用,运行过程中 TRX 结果流式传输到磁盘。 如果测试主机崩溃,TRX 文件会在崩溃之前保留收集的结果。
从 MTP 2.4 开始,当平台具有测试主机控制器时,TRX 默认使用控制器支持的恢复。 浏览器、WASI、iOS 和 tvOS 使用进程内兼容性路径。
从 MTP 2.4 开始,MTP 生成的 TRX 会保留 MSTest [WorkItem] 和 [GitHubWorkItem] 元数据。
选项
| Option | Description |
|---|---|
--report-trx |
生成 TRX 报表。 |
--report-trx-filename |
生成的 TRX 报表的名称。 从 MTP 2.3.0 开始,默认值为确定 {asm}_{tfm}_{arch}.trx 性形式;在 MTP 2.3.0 之前,默认值为 <UserName>_<MachineName>_<yyyy-MM-dd_HH_mm_ss.fffffff>.trx。 若要自定义名称,请参阅 报表文件名。 |
报表保存在可通过命令行参数指定的默认 --results-directory 文件夹中。
手动合并 TRX 文件
TRX 扩展还会注册非测试命令。 以下命令在版本 2.5.1 中可用;运行测试应用程序的 --info 选项以发现已安装版本中的命令。
若要合并现有报表而不运行其他测试,请将 merge-trx 作为第一个位置参数传递给测试应用程序:
dotnet exec Tests.dll merge-trx --input first.trx second.trx --output-trx combined.trx
--input 至少需要两个现有 .trx 文件。
--output-trx 指定输出路径,该路径必须以 .trx 结尾。 使用绝对路径或相对于当前目录的路径。 成功的合并返回退出代码 0。
此命令独立于 自动报表合并。 它不执行测试或需要 --report-trx。 不要将工具命令与测试运行选项(如 --list-tests)结合使用。
比较 TRX 结果
若要比较两个现有报表中的测试名称和结果,请使用 ms-trxcompare:
dotnet exec Tests.dll ms-trxcompare --baseline-trx baseline.trx --trx-to-compare current.trx
这两个文件选项是必需的,且必须指定现有的 .trx 文件。 当测试名称和结果匹配时,该命令将 0 返回。 缺少测试、重复的测试名称匹配或不同的结果会导致比较失败并返回退出代码 1。 该比较不是报告文件的逐字节比较,也不确定持续时间、附件或其他元数据是否匹配。
若要检查已注册的命令名称及其选项提供程序,请运行 dotnet exec Tests.dll --info。 通过测试应用程序调用这些命令,而不是通过 dotnet tool。
注释
公共 ITool 创作 API 和项目后期处理 API 仍是实验性的,并使用 TPEXP 诊断 ID。 这些命令不要求你实现或引用内部 TRX 工具类。
HTML 报表
HTML 报告会为测试会话生成一个交互式的独立 HTML 文件。 此扩展需要Microsoft。Testing.Extensions.HtmlReport NuGet 包。
注释
从版本 2.3.0 开始,MTP 中可用。 此扩展是实验性的,其选项和输出格式可能会在将来的版本中更改。
手动注册
var builder = await TestApplication.CreateBuilderAsync(args);
builder.AddHtmlReportProvider();
选项
| Option | Description |
|---|---|
--report-html |
生成 HTML 报表。 |
--report-html-filename |
生成的 HTML 报表的名称。 该值必须以 . 结尾 .html。 默认值为 {asm}_{tfm}_{arch}.html。 若要自定义名称,请参阅 报表文件名。 需要 --report-html。 |
JUnit 报表
JUnit 报表为测试会话创建与 JUnit 兼容的 XML 文件。 此扩展需要Microsoft。Testing.Extensions.JUnitReport NuGet 包。
注释
从版本 2.3.0 开始,MTP 中可用。 此扩展是实验性的,其选项和输出格式可能会在将来的版本中更改。
从 MSTest.Sdk 4.3 开始,启用此扩展。<EnableMicrosoftTestingExtensionsJUnitReport>true</EnableMicrosoftTestingExtensionsJUnitReport> 该扩展不是 MSTest.Sdk 配置文件的DefaultAllMicrosoft一部分。
手动注册
var builder = await TestApplication.CreateBuilderAsync(args);
builder.AddJUnitReportProvider();
选项
| Option | Description |
|---|---|
--report-junit |
生成 JUnit XML 报表。 |
--report-junit-filename |
生成的 JUnit XML 报表的名称。 该值必须以 . 结尾 .xml。 默认值为 {asm}_{tfm}_{arch}.xml。 若要自定义名称,请参阅 报表文件名。 需要 --report-junit。 |
CTRF 报告
CTRF 报表创建一个 JSON 文件,该文件使用测试会话的 通用测试报告格式 。 此扩展需要Microsoft。Testing.Extensions.CtrfReport NuGet 包。
注释
从版本 2.3.0 开始,MTP 中可用。 此扩展是实验性的,其选项和输出格式可能会在将来的版本中更改。
手动注册
var builder = await TestApplication.CreateBuilderAsync(args);
builder.AddCtrfReportProvider();
选项
| Option | Description |
|---|---|
--report-ctrf |
生成 CTRF JSON 报告。 |
--report-ctrf-filename |
生成的 CTRF JSON 报告的名称。 该值必须以 . 结尾 .json。 默认值为 <UserName>_<MachineName>_<assembly>_<tfm>_<timestamp>.ctrf.json。 若要自定义名称,请参阅 报表文件名。 需要 --report-ctrf。 |
从 MTP 2.4 开始,当多个测试使用相同的 UID 时,CTRF 将保留每个结果。 它还包含每个测试的附件和先前尝试的附件,并根据文件名推断其 MIME 类型。
对于重试测试,CTRF 仅在对应关系明确且无歧义时,才会关联各次尝试。 然后,它会在 retryAttempts 中记录较早的尝试,设置 retries,并将后来的成功结果标记为 flaky: true。 存在歧义的相同 UID 结果会保持分开,因此报告不会将诊断信息关联到错误的测试。
从 MTP 2.5 预览版开始, testId 派生自框架的完整 MTP 测试节点 UID。 该报告器会对其保留的身份命名空间中的值进行转义,并对较长的 UID 使用确定性的 SHA-256 标识,而不是将其截断。 每个已报告的执行都会获得一个新的 UUIDattemptId,而较早的重试尝试则会各自获得自己的 executionId。 兼容性字段 extra.uid 保留原始 MTP UID。 附件路径保持不透明值,可以指向远程使用者无法访问的本地文件。
终端摘要会标识不稳定测试和已重试测试。 TRX 和 JUnit 报告为每个测试保留一个最终结果,而不是记录每次尝试。
Azure DevOps报表
Azure DevOps报表扩展将 MTP 测试运行与Azure Pipelines集成。 它为管道日志设置错误和警告的格式,为失败和跳过的测试添加注释,创建 Markdown 作业摘要,并且可以按测试程序集对输出进行分组。 该扩展还可以识别异常或隔离的故障、上传测试项目并将结果流式传输到Azure DevOps测试运行。
在GitHub上托管代码但对Azure Pipelines代理运行测试时,故障批注可以直接显示在GitHub拉取请求中:
GitHub PR 文件视图中的 
此扩展需要 Microsoft.Testing.Extensions.AzureDevOpsReport NuGet 包。
手动注册
var builder = await TestApplication.CreateBuilderAsync(args);
builder.TestHost.AddAzureDevOpsProvider();
选项
| Option | MTP 版本 | Description |
|---|---|---|
--report-azdo |
1.9.0 | 启用Azure DevOps报表生成器。 错误和警告以Azure DevOps理解的格式写入输出。 |
--report-azdo-severity |
1.9.0 | 用于报告事件的严重级别。 有效值为 error (默认值) 和 warning。 |
--report-azdo-groups |
2.4.0 | 启用或禁用按程序集划分的日志组。 启用后,每个测试程序集的输出将显示在Azure Pipelines日志的可折叠部分。 有效值为 on 和 off。 MTP 2.4.0 预览版默认为 on;稳定的 MTP 2.4.0 版本默认为 off。 需要 --report-azdo。 |
--report-azdo-annotations |
2.4.0 | 启用或禁用失败和跳过测试的批注。 有效值为 on (默认值) 和 off。 需要 --report-azdo。 |
--report-azdo-flaky-history |
2.3.0 | 查询过去 N 天(1-90 天)的 Azure DevOps 测试结果历史记录,并用不稳定上下文标注报告的失败。 需要 --report-azdo。 |
--report-azdo-demote-known-flaky |
2.3.0 | 将 Azure DevOps 历史窗口中足够不稳定的失败(默认阈值为 25%)从错误降级为警告。 需要 --report-azdo 和 --report-azdo-flaky-history。 |
--report-azdo-slow-test-history |
2.3.0 | 查询 Azure DevOps 中指定天数内的测试结果历史记录,并降低已知运行时间较短的测试的单项测试“仍在运行”阈值。 仅接受 1 到 90 之间的恰好一个整数。 在有足够历史样本的情况下,阈值取 60 秒与历史 p99 时长乘以所配置乘数两者中的较小值。 需要 --report-azdo。 |
--report-azdo-slow-test-history-min-sample |
2.3.0 | 设置扩展使用测试历史记录调整其慢测试阈值或向慢测试输出行添加历史记录详细信息之前所需的最小历史样本数。 只接受一个大于或等于 1 的整数。 默认值是10。 需要 --report-azdo-slow-test-history。 |
--report-azdo-slow-test-history-multiplier |
2.3.0 | 设置一个乘数,用于将某项测试的历史 p99 耗时相乘,以计算其慢测试阈值。 接受恰好一个采用固定区域性格式的浮点值,该值必须大于 0 且最多为 10,000。 默认值是3。 需要 --report-azdo-slow-test-history。 |
--report-azdo-quarantine-file |
2.3.0 | 列出隔离测试完全限定名称或 glob 模式的文本文件路径。 匹配失败会被报告为警告。 需要 --report-azdo。 |
--report-azdo-summary |
2.3.0 | 在测试运行结束时生成 Markdown 作业摘要,并通过 ##vso[task.uploadsummary] 上传。 可选的文件路径参数将替代默认位置({testResultsDir}/azdo-summary-{assembly}-{tfm}-{arch}.md)。 需要 --report-azdo。 |
--report-azdo-stackframe-filter |
2.3.0 | 添加正则表达式模式,这些模式与扩展定位用户调用站点以进行标注时的每个堆栈帧的完全限定类型前缀进行匹配。 该选项可重复,最多 16 种模式,并且每个模式都使用 500 毫秒的匹配超时进行编译。 这些模式是对该扩展内置的 MSTest 断言实现前缀的补充。 需要 --report-azdo。 |
--report-azdo-upload-artifacts |
2.3.0 | 上传测试结果文件和/或向Azure DevOps添加生成标记。 有效值为 off (默认值)、tags-only和 filesall。 |
--report-azdo-upload-artifact-include |
2.3.0 | 使用相对于测试结果目录的 glob 模式,在 Azure DevOps 工件上传中包含文件。 默认值为 **/*. 需要 --report-azdo-upload-artifacts 为非 off值。 |
--report-azdo-upload-artifact-exclude |
2.3.0 | 使用相对于测试结果目录的 glob 模式,从 Azure DevOps 工件上传中排除文件。 需要 --report-azdo-upload-artifacts 为非 off值。 |
--report-azdo-upload-artifact-name |
2.3.0 | 覆盖 Azure DevOps 工件容器名称。 默认值为 TestResults_{assemblyName}_{tfm}. 需要 --report-azdo-upload-artifacts 为非 off值。 |
--publish-azdo-test-results |
2.3.0 | 在测试完成时,将结果流式传输到Azure DevOps测试运行。 该构建的测试选项卡列出了已完成的运行记录。 |
--publish-azdo-run-name |
2.3.0 | 为实时测试结果发布设置自定义Azure DevOps测试运行名称。 需要 --publish-azdo-test-results。 |
Warning
当多个测试程序集并行运行时,请勿启用组。 Azure DevOps##[group]和##[endgroup]格式化命令是按顺序和匿名的。 并发程序集输出可以交错,导致组嵌套不正确,并将行置于错误的程序集下。 如果您使用的是 MTP 2.4.0 预览版,请传入 --report-azdo-groups off 以禁用分组。 默认情况下,稳定的 MTP 2.4.0 版本禁用组。 仅对单个程序集或串行化的程序集执行传递--report-azdo-groups on。
注释
MTP 版本列列出了包含每个选项的第一个 MTP 版本。 Azure DevOps 扩展本身在 MTP 1.9.0 中已趋于稳定,并包含 --report-azdo 和 --report-azdo-severity;其余选项则是在 MTP 2.3.0 或 2.4.0 中添加的。
该扩展通过检查 TF_BUILD 环境变量自动检测它在持续集成(CI)环境中运行。
Important
Azure DevOps历史记录查询需要TF_BUILD=true、SYSTEM_COLLECTIONURI、SYSTEM_TEAMPROJECT和SYSTEM_ACCESSTOKENBUILD_DEFINITIONID。 如果缺少任何值,MTP 将在没有历史数据的情况下继续运行,跳过 flaky-history 注释,并对慢速测试行使用静态的 60 秒阈值。
使用--publish-azdo-test-results进行实时发布需要TF_BUILD=true、SYSTEM_COLLECTIONURI、SYSTEM_TEAMPROJECT、SYSTEM_ACCESSTOKEN和BUILD_BUILDID。 如果有任何值缺失或无效,MTP 会发出警告,并且不会发布测试运行。
从 MTP 2.4.0 开始,Azure DevOps Markdown 摘要会在一次 dotnet test 调用中汇总所有测试模块的结果。 如果还启用了代码覆盖率,摘要中会包含已覆盖数和总数、百分比、阈值结果,以及覆盖率数据不完整时的指示标记。
从 MTP 2.5 预览版开始,摘要还显示通过率、不合格测试历史记录、持续时间比较、测试依赖项边缘、重点故障诊断,以及用于多模块运行的紧凑确定性布局。
从 MTP 2.4 开始,实时发布会自动将失败的测试结果的文件附件上传到 Azure DevOps 测试结果中。 不成功的结果包括失败、出错、超时和取消的结果。
当结果提供标准输出或标准错误时,对于每个内联流,扩展最多可以附加 256 KiB。 每个基于文件的附件大小上限为 16-MiB。
该扩展还会将运行级 .coverage、.cobertura.xml 和 .opencover.xml 文件作为代码覆盖率附件上传。 这些测试运行附件和结果附件独立于 --report-azdo-upload-artifacts,后者会将选定的文件作为 Azure Pipelines 生成项目上传。
对于已重试的测试,Azure DevOps 会将之前的尝试发布为子结果,并将每次尝试生成的工件附加到生成这些工件的子结果中。 如果安全重试关联不可用,扩展会发布单独的结果,而不是删除它。
实时发布时,如果创建了运行任务,系统会输出该运行任务的 URL,以便您在任务完成前跟踪结果。 当管道环境提供这些信息时,它还会发送 pipelineReference 和开始日期。 生成“ 测试 ”选项卡未列出正在进行的运行;它列出完成后的运行。
GitHub Actions 报告
GitHub Actions 报告发出 GitHub Actions 原生工作流命令,因此测试运行在运行器上产生一流体验:每程序集日志组、失败和跳过测试的批注(显示在工作流“批注”选项卡中,以及当源位置解析时在拉取请求的“文件已更改”差异中)、附加到 GITHUB_STEP_SUMMARY 引用的文件的 Markdown 作业摘要,以及慢测试通知。
此扩展需要Microsoft。Testing.Extensions.GitHubActionsReport NuGet 包。
仅当运行在GitHub Actions(GITHUB_ACTIONS环境变量为true)且--report-gh开关已设置时,该扩展才会激活;否则不会执行任何操作。 处于活动状态时,默认启用每个功能,并可以使用其 --report-gh-* 选项单独关闭。
Important
选项 --report-gh 属于 Microsoft.Testing.Extensions.GitHubActionsReport.
GitHubActionsTestLogger 包提供另一个选项--report-github。 这些选项不是别名,仅在测试项目注册拥有该选项的包时才起作用。
注释
该扩展从 MTP 2.3.0 开始可用。 从 MTP 2.4.0 开始,其公共入口点不再具有实验性。
手动注册
var builder = await TestApplication.CreateBuilderAsync(args);
builder.AddGitHubActionsProvider();
选项
| Option | MTP 版本 | Description |
|---|---|---|
--report-gh |
2.3.0 | 启用GitHub Actions报表生成器,以便测试运行发出工作流命令。 要求该运行在 GitHub Actions 上执行。 |
--report-gh-groups |
2.3.0 | 启用或禁用按程序集划分的日志组。 有效值为 on (默认值) 和 off。 需要 --report-gh。 |
--report-gh-annotations |
2.3.0 | 启用或禁用失败和跳过测试的批注。 有效值为 on (默认值) 和 off。 需要 --report-gh。 |
--report-gh-step-summary |
2.3.0 | 控制扩展是否将 Markdown 作业摘要写入所 GITHUB_STEP_SUMMARY引用的文件。 有效值为on(默认值),off从 MTP 2.4.0 开始。 on-failure 需要 --report-gh。 |
--report-gh-step-summary-sections |
2.4.0 | 选择摘要内容。 有效值为 test-results、 slow-tests、 coverage和 all (默认值)。 需要 --report-gh 和摘要模式,而不是 off。 |
--report-gh-failure-details |
2.4.0 | 启用或禁用作业摘要中的有限失败详细信息。 使用 on (默认值) 或 off。 详细信息包括消息、异常类型、源位置和堆栈跟踪(如果可用)。 需要 --report-gh。 |
--report-gh-history |
2.4.0 | 读取和更新指定文件路径处的有限本地测试历史记录快照。 工作流必须在运行之前下载以前的快照,然后上传更新的文件。 需要 --report-gh。 |
--report-gh-history-window |
2.4.0 | 将保留的历史记录窗口设置为 1 到 90 天。 默认值为 30 天。 需要 --report-gh-history。 |
--report-gh-slow-test-notices |
2.3.0 | 启用或禁用慢速测试通知。 有效值为 on (默认值) 和 off。 需要 --report-gh。 |
--report-gh-slow-test-threshold |
2.3.0 | 发出慢测试通知前测试可运行的持续时间。 接受不带单位的秒数,或带单位后缀的值,例如 90s、2m 或 1.5h。 默认值为 60s。 需要 --report-gh。 |
从 MTP 2.4.0 开始,GitHub Actions Markdown 摘要会聚合一次dotnet test调用中所有测试模块的结果。 如果还启用了代码覆盖率,请选择 coverage 或 all,以显示已覆盖数和总数、百分比、阈值结果,以及覆盖率数据不完整时的指示标志。
故障详细信息保留在有限消息、堆栈、故障计数和整体摘要预算范围内。 当内容超出限制时,报表会截断或压缩它,并指出摘要中的减少。