Azure Test Plans触发自动化测试:YAML配置及相关疑问
解答你的Azure Test Plans自动化测试触发问题
我来帮你拆解这三个问题,结合Azure DevOps的实际机制给你说清楚:
1. 为什么需要发布管道?
你可能会疑惑:我已经有构建管道能跑测试了,为啥还要多一个发布管道?其实核心原因是Azure Test Plans的自动化测试触发机制需要一个专门的"执行层"来衔接测试案例和测试执行:
- 构建管道的核心职责是产出可执行的测试资产(比如.NET Core测试二进制文件、测试容器镜像),它的触发逻辑通常是代码提交、定时计划这类,没有和Test Plans里的具体测试案例做关联的入口。
- 当你在Test Plans里点击"运行自动化测试"时,本质是要指定哪些关联了自动化测试的测试案例要执行,并且把测试结果回传到对应的测试案例上。这个功能需要一个能接收Test Plans触发信号、关联测试计划/套件配置的流水线——这就是官方文档说的"发布管道"的作用(现在Azure DevOps里也可以用YAML多阶段管道的测试阶段来替代传统经典发布管道)。
简单说:构建是"造测试包",测试执行阶段(原发布管道的角色)是"按Test Plans的要求跑测试并同步结果",二者职责不同,Test Plans的触发需要这个中间层来完成关联。
2. 如何用YAML定义可被Test Plans触发的测试执行流程?
不用局限于经典手动发布管道,你可以直接在现有YAML构建管道里新增一个专门的测试执行阶段,把它配置成可被Test Plans触发。核心是要给这个阶段配置测试计划/套件的关联,并且允许手动触发。
下面是一个完整的YAML示例,包含构建、测试执行两个阶段:
stages: - stage: Build displayName: '构建测试资产' jobs: - job: BuildTests steps: # 构建.NET Core测试项目 - task: DotNetCoreCLI@2 inputs: command: 'build' projects: '**/*Tests.csproj' arguments: '--configuration Release' # 上传测试二进制文件作为构建产物 - task: PublishPipelineArtifact@1 inputs: targetPath: '$(System.DefaultWorkingDirectory)/bin/Release' artifact: 'test-binaries' publishLocation: 'Container' - stage: TestExecution displayName: '执行自动化测试(可被Test Plans触发)' dependsOn: Build condition: succeeded() jobs: - job: RunAssociatedTests steps: # 下载构建阶段产出的测试二进制文件 - task: DownloadPipelineArtifact@2 inputs: buildType: 'current' artifactName: 'test-binaries' targetPath: '$(System.DefaultWorkingDirectory)/tests' # 运行测试并关联到Test Plans - task: VSTest@2 inputs: testSelector: 'testAssemblies' testAssemblyVer2: | **/*Tests.dll !**/*TestAdapter.dll !**/obj/** searchFolder: '$(System.DefaultWorkingDirectory)/tests' # 关键配置:关联你的测试计划、套件、配置 testRunTitle: 'Test Plans触发的自动化测试' testPlan: '你的测试计划ID' testSuite: '你的测试套件ID' testConfiguration: '你的测试配置ID' publishRunAttachments: true
配置完后,你需要在Azure DevOps的Test Plans里做最后一步关联:
- 打开你的测试套件,点击顶部的"运行自动化测试"
- 在弹出的窗口中,选择这个YAML管道的
TestExecution阶段 - 保存配置后,以后就能直接在Test Plans里点击触发这个阶段了
3. 可以运行容器化测试吗?
完全可以!你只需要在构建阶段构建并推送测试容器镜像,然后在测试执行阶段拉取镜像、在容器内运行测试,最后把结果回传到Test Plans。
下面是容器化测试的YAML示例:
stages: - stage: Build displayName: '构建测试容器镜像' jobs: - job: BuildTestImage steps: # 构建并推送测试容器镜像到ACR(或其他注册表) - task: Docker@2 inputs: containerRegistry: '你的容器注册表服务连接' repository: 'test-project' command: 'buildAndPush' Dockerfile: '**/Dockerfile' tags: 'latest' - stage: TestExecution displayName: '在容器中执行测试' dependsOn: Build jobs: - job: RunContainerizedTests steps: # 拉取构建好的测试镜像 - task: Docker@2 inputs: containerRegistry: '你的容器注册表服务连接' repository: 'test-project' command: 'pull' tags: 'latest' # 运行容器执行测试,导出测试结果文件 - script: | # 运行容器,执行测试并生成trx格式的结果文件 docker run --name test-container your-registry/test-project:latest dotnet test --logger trx --results-directory /test-results # 把容器内的测试结果复制到代理机器上 docker cp test-container:/test-results $(System.DefaultWorkingDirectory)/test-results # 清理容器 docker rm test-container displayName: '在容器中运行测试并导出结果' # 把测试结果发布到Test Plans - task: PublishTestResults@2 inputs: testResultsFormat: 'VSTest' testResultsFiles: '**/*.trx' searchFolder: '$(System.DefaultWorkingDirectory)/test-results' testRunTitle: '容器化自动化测试' testPlan: '你的测试计划ID' testSuite: '你的测试套件ID'
这样配置后,你同样可以在Test Plans里触发这个测试执行阶段,测试会在容器内运行,结果自动同步到对应的测试案例中。
内容的提问来源于stack exchange,提问作者Tobias von Falkenhayn
相关产品推荐
相关产品推荐

