Azure DevOps流水线拆分任务到独立Job后找不到测试如何解决
你猜测的原因完全正确,Azure DevOps中不同Job默认运行在独立的代理实例上,前一个Job的所有本地文件都会在Job结束后被清理,不会自动传递到后续依赖Job,因此test Job的工作目录中没有编译生成的测试dll,才会触发找不到测试源的报错。
问题修复方法
你需要通过「发布构建制品+下载构建制品」的方式,将build Job的编译产物传递到test Job中,具体修改如下:
- 在build Job的VSBuild任务末尾,添加发布构建制品的步骤,将编译产出上传到流水线制品库:
- task: PublishBuildArtifacts@1 inputs: PathtoPublish: '$(System.DefaultWorkingDirectory)' ArtifactName: 'build-output' publishLocation: 'Container'
如果需要缩小制品体积,也可以只指定发布包含测试dll的路径,比如PathtoPublish: '**/bin/$(buildConfiguration)'。
- 在test Job的最开头,添加下载构建制品的步骤,将build Job上传的产物拉取到当前Job的工作目录:
- task: DownloadBuildArtifacts@0 inputs: buildType: 'current' downloadType: 'single' artifactName: 'build-output' downloadPath: '$(System.DefaultWorkingDirectory)'
修改完成后原有VSTest任务的配置无需调整,即可正常识别到测试dll。
多环境变量测试实现方案
该需求有成熟的实现方案,最常用的是Job矩阵配置,可实现不同环境测试的隔离运行,甚至并行执行:
- job: test displayName: Run unit tests dependsOn: build # 定义测试矩阵,每个矩阵项对应一个独立的测试Job实例 strategy: matrix: ENV_Development: TEST_ENV: "development" # 可自定义任意环境变量 DB_CONN_STR: "开发环境数据库连接串" ENV_Test: TEST_ENV: "test" DB_CONN_STR: "测试环境数据库连接串" ENV_Staging: TEST_ENV: "staging" DB_CONN_STR: "预发环境数据库连接串" steps: # 第一步先下载构建制品 - task: DownloadBuildArtifacts@0 inputs: buildType: 'current' downloadType: 'single' artifactName: 'build-output' downloadPath: '$(System.DefaultWorkingDirectory)' # 可添加配置替换任务,将环境变量写入测试配置文件 - task: FileTransform@1 inputs: folderPath: '$(System.DefaultWorkingDirectory)' fileType: 'json' targetFiles: '**/appsettings.Test.json' # 原有VSTest任务无需调整 - task: VSTest@2 inputs: platform: '$(buildPlatform)' configuration: '$(buildConfiguration)' runInParallel: false codeCoverageEnabled: true testAssemblyVer2: | **\*test*.dll !**\ProjectName.IntegrationTests.dll !**\*TestAdapter.dll !**\obj\** searchFolder: '$(System.DefaultWorkingDirectory)'
该方案的优势如下:
- 每个环境的测试完全隔离,单个环境测试失败不会影响其他环境
- 可开启并行运行,大幅降低多环境测试的总耗时
- 支持单独重跑指定环境的测试任务,无需重新执行构建流程
如果测试耗时短、不需要并行运行,也可以选择在同一个test Job中按顺序执行多轮测试,每轮测试前替换对应环境变量即可。
内容的提问来源于stack exchange,提问作者Tom Andrews
相关产品推荐
相关产品推荐

