使用 API 以编程方式在 Azure DevOps Pipeline 中添加和更新测试

2024-01-21

我正在将我们的一个项目转换为使用 Azure DevOps 而不是 AppVeyor 进行 CI。作为构建的一部分,我们使用自定义测试运行器来执行某些测试。

在 AppVeyor 中运行时,我们直接从测试运行程序调用 REST API,以通知构建服务器正在运行的测试并更新其状态。这非常简单,如其 REST 部分所示添加测试 https://www.appveyor.com/docs/build-worker-api/#add-tests and 更新测试 https://www.appveyor.com/docs/build-worker-api/#update-tests文档,并使我们能够很好地集成到 AppVeyor 的 UI 中。

我一直在研究如何在 Azure DevOps 中做同样的事情。我找到了 REST API 的一部分adding https://learn.microsoft.com/en-us/rest/api/azure/devops/test/results/add?view=azure-devops-rest-5.1 and updating https://learn.microsoft.com/en-us/rest/api/azure/devops/test/results/update?view=azure-devops-rest-5.1检测结果。从 API 文档中尚不完全清楚这是否是我在运行管道期间使用的,或者是否适用于其他场景。我已经搜索过其他人试图做同样的事情,但到目前为止没有任何运气。大多数示例都讨论上传测试结果文件,但这似乎是发布测试结果的一种相当间接的方式,特别是因为我想在运行之前注册所有测试,然后在完成时更新其状态。

有没有人有关于在构建期间使用 Azure DevOps API 发布测试结果的任何指示或示例?


详细解决方案:

在梅林梁的回答指导下,我现在已经开始工作了。

Step 1.首先,我创建了一个新的测试运行,这是我在构建作业结束时执行的(称为Build)使用 powershell 脚本:

  - powershell: |
      $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/test/runs?api-version=5.0"
      $body = @{
          "name" = "IntegrationTests"
          "build" = @{
              "id" = $env:BUILD_BUILDID
          }
          "isAutomated" = $TRUE
          "state" = "InProgress"
      }
      $json = $body | ConvertTo-Json
      $result = Invoke-RestMethod -Method 'Post' -Uri $url -Body $json -ContentType 'application/json' -Headers @{
          Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
      }
      $runId = $result.id
      echo "##vso[task.setvariable variable=INTEGRATION_TEST_RUN_ID;isOutput=true]$runId"
    displayName: 'Create test run'
    name: CreateTestRun
    env:
      SYSTEM_ACCESSTOKEN: $(System.AccessToken)

请注意,您必须明确授予脚本访问权限System.AccessToken in the env部分,因为默认情况下该变量不会放入环境变量中。测试运行状态应该是InProgress确保测试在运行时显示在构建的测试列表中。

Step 2.接下来,我的管道分散成并行作业来运行测试,这需要访问INTEGRATION_TEST_RUN_ID我在上面创建的变量,因此我将其导入到作业中:

  - job: IntegrationTests
    dependsOn: Build
    variables:
      INTEGRATION_TEST_RUN_ID: $[ dependencies.Build.outputs['CreateTestRun.INTEGRATION_TEST_RUN_ID'] ]
    strategy:
      parallel: 2
    ...

然后我的测试运行程序(用 C# 编写)可以构造 URLPOSTing and PATCH荷兰国际集团测试:

$"{this.apiUrl}{this.projectName}/_apis/test/runs/{this.testRunId}/results?api-version=5.0"

并添加测试附件:

$"{this.apiUrl}{this.projectName}/_apis/test/runs/{this.testRunId}/results/{testResultId}/attachments?api-version=5.0-preview.1"

这些类成员变量只是从通常的环境变量中读取,并且testResultId是我最初时API返回的IDPOST考试。

再次,我明确设置SYSTEM_ACCESSTOKEN in an env当我从 Azure Pipeline YAML 调用测试运行程序并在授权标头中使用它时。

Step 3.最后,我再次在专用作业中将测试运行标记为完成,该作业取决于集成测试作业,并且即使测试失败也必须始终运行:

  - job: EndIntegrationTests
    dependsOn:
      - Build
      - IntegrationTests
    condition: always()
    variables:
      INTEGRATION_TEST_RUN_ID: $[ dependencies.Build.outputs['CreateTestRun.INTEGRATION_TEST_RUN_ID'] ]
    steps:
    - checkout: none

    - powershell: |
        $url = "$($env:SYSTEM_TEAMFOUNDATIONCOLLECTIONURI)$env:SYSTEM_TEAMPROJECTID/_apis/test/runs/$($env:INTEGRATION_TEST_RUN_ID)?api-version=5.0"
        Write-Host "URL: $url"
        $body = @{
            "state" = "Completed"
        }
        $json = $body | ConvertTo-Json
        Invoke-RestMethod -Method 'Patch' -Uri $url -Body $json -ContentType 'application/json' -Headers @{
            Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
        }
      displayName: 'Complete test run'
      env:
        SYSTEM_ACCESSTOKEN: $(System.AccessToken)

请注意,这项工作需要明确依赖于Build这样我就可以读取输出变量INTEGRATION_TEST_RUN_ID,这显然取决于IntegrationTests以便在所有测试完成之前它不会完成测试运行。


你已经非常接近答案了。请参阅此文档:“测试”选项卡中的表面测试结果 https://learn.microsoft.com/en-us/azure/devops/pipelines/test/review-continuous-test-results-after-build?view=azure-devops#surface-test-results-in-the-tests-tab.

除了通过任务上传测试结果,如发布测试结果任务、VS测试等,我们还提供了通过任务上传结果的方法:

为了实现您想要的目标,您必须首先使用一个已知的内部版本号创建一个测试运行,然后将测试结果发布到该测试运行中。

  1. Create https://learn.microsoft.com/en-us/rest/api/azure/devops/test/results/update?view=azure-devops-rest-5.0#buildreference对现有构建的新测试,指定buildID在请求正文中。

Sample:

POST https://dev.azure.com/{org name}/{project}/_apis/test/Runs/{runId}/results?api-version=5.0

{
 "name": "NewTest", 
 "build": { "id": "162" }, 
 "isAutomated": true, 
 "state": "Waiting" 
}
  1. 运行测试,以便得到测试结果。

  2. 现在,将这个新的测试结果发布到之前创建的测试中。

[ {“testCaseTitle”:“ReferBuild”, "automatedTestName": "ReferBuildAuto", “优先级”:1, “结果”:“通过” }]

这里你可以参考下面的例子doc https://learn.microsoft.com/en-us/rest/api/azure/devops/test/results/add?view=azure-devops-rest-5.0#examples.

  1. 最后,你可以使用update https://learn.microsoft.com/en-us/rest/api/azure/devops/test/results/update?view=azure-devops-rest-5.0 api.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 API 以编程方式在 Azure DevOps Pipeline 中添加和更新测试 的相关文章

随机推荐

  • 如何将十六进制转换为十进制?

    我有不同的十六进制数据传入并存储到整数类型寄存器中 当我使用 fprint 时 我可以看到以下内容 0x3076 0x307c 但是 我想显示上述十六进制数据的十进制版本 如下所示 12406 12412 理论上 假设对于第一个值 您可以执
  • 无法将 FTP 连接到 Azure 虚拟机

    我在 Azure 中配置了 Windows Server 2012 虚拟机 当我尝试通过 FileZilla FTP 客户端连接到它时 我得到一个Could not connect to server error 到目前为止 这是我尝试过的
  • Angular.js 更新指令中的 SVG 模板

    不久前我问过 Angular js 在指令中渲染 SVG 模板 https stackoverflow com questions 19568226 angular js rendering svg templates in directi
  • 稳定基线不适用于张量流

    因此 我最近重新回到机器学习领域 并决定开始 ConnectX 的 Kaggle 课程 https www kaggle com learn intro to game ai and reinforcement learning https
  • 如何将 C# 中的标签添加到 XAML 代码中的网格中?

    我有这个模板
  • python中的二分查找算法

    我正在尝试用 python 实现二分搜索 并将其编写如下 但是 只要needle element大于数组中的最大元素 我就无法让它停止 你能帮我吗 谢谢 def binary search array needle element mid
  • 为什么不调用重写的“operator new”?

    我在VS2005中运行以下代码 include
  • 将当前对象 ($this) 转换为后代类

    我有一个类 可能需要将对象更改为进一步的后代类 这可能吗 我知道一个选择是返回它的副本 但使用子类代替 但实际修改当前对象会很好 所以 class myClass protected var function myMethod functi
  • 从 Pandas 中的日期时间 <[M8] 中删除时间

    所以我的数据框中有一个 日期 列 其中日期的格式如下 0 1998 08 26 04 00 00 如果我只想要年月日 我该如何去掉琐碎的时间 最快的方法是使用 DatetimeIndex 标准化 您首先需要将该列设为 DatetimeInd
  • Flutter Web Firebase TypeError:dart.global.firebase.firestore 不是函数

    我正在尝试在我的 flutter web 项目中使用 Firebase 但应用程序无法使用此消息运行 TypeError dart global firebase firestore is not a function at Object
  • 减少 Android studio 中的 Gradle 同步时间

    我使用的是 16GB 内存 SSD 硬盘的 Mac 每次构建 清理或打开项目时 Gradle 同步仍然需要 15 分钟以上 是否有任何 Android Studio 优化可以减少这个时间 更新 所有这些都在一定程度上有所帮助 将所有编译 c
  • 角度材质 未显示在自定义组件中

    所以我做了很多研究 但我就是无法弄清楚 我想使用 Angular 材质表单控件制作一个文本框组件 按照此tutorial https material angular io guide creating a custom form fiel
  • FluentMigrator迁移成功,但数据库没有变化

    我一定错过了一些非常基本的东西 我正在开发一个遗留项目 并且我正在尝试将 FluentMigrator 加入其中 因为我有一些有趣的数据库 我认为即将发生的变化和数据迁移将会产生很大的影响 使用此工具更容易 对于初始迁移 我只想将数据库提升
  • Hibernate @Table 注解中的动态模式

    想象一下 您在两个环境中有四个 MySQL 数据库模式 foo 产品数据库 bar 正在进行的重组foo db foo beta 测试数据库 and bar beta 新结构的测试数据库 此外 假设您有一个 Spring Boot 应用程序
  • jqgrid rowattr 不应用类

    我想根据列的值将背景颜色应用于 jqGrid 行的行 但是基本 rowattr 并未将类应用于行 下面是代码 为了简单起见 我删除了需要应用颜色的条件 jQuery employeeSalarysGrid jqGrid height 250
  • Azure 托管代理 - Visual Studio 2017

    我在 Azure 中设置了托管代理来执行 CI 构建 但在构建失败之前的 Visual Studio 构建步骤中收到以下警告 找不到 Visual Studio 版本 15 0 正在寻找最新版本 查看托管代理的文档 它们似乎没有使用 Vis
  • Matplotlib 图例中的字幕

    我正在使用 matplotlib 进行一些绘图 并且有一个图例告诉查看者这些点是用哪些传感器记录的 有多种类型的多个传感器 我希望在图例中添加字幕来告诉观众每组传感器的类型 我有一个可行的解决方案 但它有点像黑客 如下所示 创建图例时 它接
  • has_many 和belongs_to 关联的单选按钮

    我有一个 has many 和 Belongs to 关联 class Link lt ActiveRecord Base has and belongs to many categories belongs to property end
  • 如何在流程中获取函数的返回类型?

    以此为例 const myObj test true type MyType typeof myObj const getValue MyType gt return myObj how to do this type TheReturnT
  • 使用 API 以编程方式在 Azure DevOps Pipeline 中添加和更新测试

    我正在将我们的一个项目转换为使用 Azure DevOps 而不是 AppVeyor 进行 CI 作为构建的一部分 我们使用自定义测试运行器来执行某些测试 在 AppVeyor 中运行时 我们直接从测试运行程序调用 REST API 以通知