如何更新 Azure Devops 测试结果以显示 PassedOnRerun

问题描述 投票:0回答:2

我想知道如何将我的测试重新运行结果链接到原始测试结果。我的自动化测试管道如下所示:

  1. 运行测试
  2. 公布结果
  3. 检查是否有失败的测试
    • 重新运行失败的测试(如果有)
    • 发布重新运行测试结果

我想将重新运行测试结果添加到原始测试运行结果中,以便我可以使用“PassedOnRerun”切换来过滤管道上的测试。此外,如果测试在原始测试和重新运行中都失败了,那么如果能够在原始测试运行中同时存在两个失败原因,那就太好了。

enter image description here

我无法找到如何使用 devops REST API 使用子结果更新测试结果的可靠示例。

azure-devops azure-devops-rest-api
2个回答
1
投票

同样的问题已经在 2020 年的 MS 开发者社区上发布了here。该问题得到的支持太少,因此没有技术答案。

截至 2022 年 5 月,我可以确认:

  1. 问题依然存在。
  2. 使用不同的 PublishTestResults 任务发布同一测试的结果永远不会报告“重新运行时已通过”,即使第二次运行包含具有相同名称和 ID 的通过测试(无聚合)。

我也做了这些观察:

  1. 使用不同的 PublishTestResults 任务发布结果会将每个测试执行报告为单独的测试,即使存在具有相同 ID 的同名测试(无聚合)。
  2. VSTest 任务使用选项“rerunFailedTests: True”发布的 TRX 文件始终生成“PassedOnRerun”(聚合)。
  3. 使用 2 个单独的 PublishTestResults 任务从上述 VSTest 任务发布完全相同的 TRX 文件永远不会产生“PassedOnRerun”(无聚合)。
  4. PublishTestResults 任务没有生成聚合的选项。
  5. 没有 Azure DevOps REST API 端点允许将测试结果标记为重新运行等。

所有这些观察结果都清楚地表明这样的结论:“重新运行时传递”报告只是 VSTest 任务的一个功能,并且不能由其他任务重现。您是否尝试过使用带有选项“rerunFailedTests: True”的 VSTest 任务

为了获得重新运行时通过的测试的一些报告,我使用以下管道:

  1. 运行测试(.NET Core 任务)
  2. 解析生成的TRX文件
  3. 仅发布通过测试的结果(操作 TRX 文件)
  4. 仅运行失败的测试(从 TRX 文件解析)
    • 解析新生成的TRX文件
    • 仅发布通过测试的结果 - 这些是“重新运行通过”
    • 仅发布失败测试的结果 - 这些是“两次尝试失败”

0
投票

如果有人仍在寻找答案:

我能够使用 Azure Devops REST API 来实现此目的。它在这里记录,没有适当的解释:https://learn.microsoft.com/en-us/rest/api/azure/devops/test/results/update?view=azure-devops-rest-7.2&tabs=HTTP #自定义测试字段

这是一个粗略的示例,可以帮助您使用客户端 API:

// use VssConnection
var testClient = _connection.GetClient<TestManagementHttpClient>();
var testResultId = 123;

await testClient.UpdateTestResultsAsync(
     [new TestCaseResult
     {
         Id = testResultId,
         Outcome = TestOutcome.Passed.ToString(), // assuming the test passed in the final attempt
         //  other fields omitted for brevity
         ResultGroupType = ResultGroupType.Rerun, // ADO will show this as the parent node containing each attempt
         SubResults = new List<TestSubResult>
         {
             // each attempt is a subresult
              new TestSubResult
                    {
                        ParentId = testResultId,
                        // other fields omitted for brevity,
                        CustomFields = new List<CustomTestField> { new CustomTestField { FieldName = "AttemptId", Value = 1 } }
                    }
         },
         CustomFields = new List<CustomTestField> { 
                 new CustomTestField { FieldName = "AttemptId", Value = 3 }, 
                 new CustomTestField { FieldName = "IsTestResultFlaky", Value = true 
             } 
         }
     }],
     project: _teamProject,
     runId: 456, // the test run id
     cancellationToken: CancellationToken.None
);

使用与上面类似的代码,通过Azure Devops查看时我能够实现这个结果

© www.soinside.com 2019 - 2024. All rights reserved.