You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个Azure Pipeline中使用多测试环境并行执行测试?

优化Azure DevOps测试流水线自动选择可用环境方案

核心思路

基于Azure DevOps的环境资源锁定机制+动态变量加载,让单条流水线自动识别并独占空闲测试环境,完成测试后自动释放,实现无需手动干预的并行测试。

具体实现步骤

1. 统一管理测试环境配置与资源

  • 为每个测试环境(如test-env-1、test-env-2)创建专属变量组,存储该环境的SQL连接字符串、网站部署地址、环境名称等独有配置。
  • 在Azure DevOps环境模块中,给每个测试环境设置独占资源锁,确保同一时间仅能有一个流水线实例占用该环境。

2. 流水线中添加环境自动选择逻辑

在YAML流水线开头加入环境选择阶段,通过PowerShell脚本扫描所有测试环境的锁定状态,自动锁定并输出第一个空闲环境:

stages:
- stage: SelectEnvironment
  jobs:
  - job: FindAndLockEnv
    steps:
    - powershell: |
        # 获取所有前缀为test-env-的测试环境
        $envs = az devops environment list --query "value[?contains(name, 'test-env-')].name" -o tsv
        foreach ($env in $envs) {
          # 检查环境是否处于未锁定状态
          $lockStatus = az devops environment show --name $env --query "resourceLocks[0].status" -o tsv
          if ($lockStatus -ne "locked") {
            # 锁定该环境为独占模式
            az devops environment lock --name $env --lock-type exclusive
            # 将选中环境名称设为流水线输出变量
            Write-Host "##vso[task.setvariable variable=selectedEnv;isOutput=true]$env"
            exit 0
          }
        }
        # 若所有环境均被占用,抛出错误触发等待
        throw "所有测试环境当前均在使用中,请稍后重试。"
      name: EnvSelector
      displayName: '查找并锁定可用测试环境'
      env:
        AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)

3. 动态加载选中环境的配置并执行部署测试

后续部署与测试阶段,通过流水线输出变量动态加载对应环境的变量组,并指定部署目标环境:

- stage: DeployAndRunTests
  dependsOn: SelectEnvironment
  variables:
  # 动态加载选中环境的变量组
  - group: $[ dependencies.SelectEnvironment.outputs['EnvSelector.selectedEnv'] ]
  jobs:
  - deployment: DeployApplication
    environment: $[ dependencies.SelectEnvironment.outputs['EnvSelector.selectedEnv'] ]
    strategy:
      runOnce:
        deploy:
          steps:
          - task: SqlAzureDacpacDeployment@1
            displayName: '部署SQL数据库'
            inputs:
              azureSubscription: $(AzureSubscription)
              ServerName: $(SqlServerName)
              DatabaseName: $(SqlDatabaseName)
              SqlUsername: $(SqlUsername)
              SqlPassword: $(SqlPassword)
              DacpacFile: '**/*.dacpac'
          - task: AzureRmWebAppDeployment@4
            displayName: '部署ASP.NET网站'
            inputs:
              ConnectionType: 'AzureRM'
              azureSubscription: $(AzureSubscription)
              WebAppName: $(WebAppName)
              PackageForLinux: '**/*.zip'
  - job: ExecuteTests
    dependsOn: DeployApplication
    steps:
    - task: VSTest@2
      displayName: '运行功能与UI测试'
      inputs:
        testSelector: 'testAssemblies'
        testAssemblyVer2: '**/*Tests.dll'
        searchFolder: '$(System.DefaultWorkingDirectory)'
        runSettingsFile: 'Tests.runsettings'
        overrideTestrunParameters: '-TestEnvironmentUrl $(TestEnvironmentUrl)'

4. 测试完成后自动释放环境

添加收尾阶段,无论测试成功或失败,都自动释放已锁定的环境:

- stage: ReleaseEnvironment
  dependsOn: DeployAndRunTests
  condition: always() # 强制执行,不受前置阶段结果影响
  jobs:
  - job: UnlockTestEnv
    steps:
    - powershell: |
        az devops environment unlock --name $(selectedEnv)
      displayName: '释放测试环境锁定'
      env:
        AZURE_DEVOPS_EXT_PAT: $(System.AccessToken)

方案优势

  • 单流水线统一管理:避免YAML代码重复,所有测试实例的运行记录集中展示,便于排查问题
  • 自动负载均衡:流水线自动选择第一个空闲环境,无需手动分配
  • 环境隔离保障:通过独占锁彻底避免并行部署时的资源覆盖与干扰问题

内容的提问来源于stack exchange,提问作者user2519450

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 17:20:11