Azure Pipeline中如何将多个VSTest任务结果追加到同一文件夹
问题原因
VSTest@2任务默认会在执行前清空配置的resultsFolder目录下所有内容,同时你当前的配置存在路径笔误:第一个任务输出路径是TestResults(带复数s),第二个是TestResult(不带s),就算把路径改成一致,后执行的任务也会清空前一个任务生成的结果文件,导致覆盖。另外你当前单元测试的文件匹配规则没有排除集成测试程序集,会导致集成测试用例被重复执行。
实现方案
以下两个方案都可以实现结果统一存储,可根据实际场景选择:
方案1:分目录存储+统一合并(最稳定,无覆盖风险)
该方案完全规避文件重名、任务自动清空的问题,步骤如下:
- 管道初始化阶段提前创建最终的
TestResult目录和两个临时子目录,同时清空历史残留文件 - 调整两个VSTest任务的输出路径,分别指向两个独立的临时子目录,避免运行时互相清理文件
- 两个测试任务全部执行完成后,将两个临时目录下的所有结果文件复制到最终的
TestResult根目录
参考YAML配置:
# 初始化阶段:提前清理并创建目录,放在两个VSTest任务之前 - task: PowerShell@2 inputs: targetType: 'inline' script: | $finalPath = '$(Build.SourcesDirectory)\SiprotecUnitTestSolution\TestResult' $unitTemp = Join-Path $finalPath 'unit_temp' $itTemp = Join-Path $finalPath 'it_temp' if (Test-Path $finalPath) { Remove-Item $finalPath -Recurse -Force } New-Item -ItemType Directory -Path $unitTemp -Force New-Item -ItemType Directory -Path $itTemp -Force # 单元测试任务 - task: VSTest@2 inputs: testSelector: 'testAssemblies' testAssemblyVer2: | **\*tests.dll !**\*TestAdapter.dll !**\obj\** !**\moq.dll !**\*tests.IT.dll # 排除集成测试程序集,避免重复执行 searchFolder: '$(System.DefaultWorkingDirectory)' codeCoverageEnabled: true otherConsoleOptions: '--collect:"Code Coverage"' resultsFolder: '$(Build.SourcesDirectory)\SiprotecUnitTestSolution\TestResult\unit_temp' # 集成测试任务 - task: VSTest@2 displayName: 'ITTest' inputs: testSelector: 'testAssemblies' testAssemblyVer2: | **\*tests.IT.dll !**\*TestAdapter.dll !**\obj\** !**\moq.dll searchFolder: '$(System.DefaultWorkingDirectory)' codeCoverageEnabled: true otherConsoleOptions: '--collect:"Code Coverage"' resultsFolder: '$(Build.SourcesDirectory)\SiprotecUnitTestSolution\TestResult\it_temp' # 合并所有结果到TestResult根目录 - task: CopyFiles@2 inputs: SourceFolder: '$(Build.SourcesDirectory)\SiprotecUnitTestSolution\TestResult' Contents: '**/*' TargetFolder: '$(Build.SourcesDirectory)\SiprotecUnitTestSolution\TestResult' flattenFolders: true overWrite: false
复制完成后可按需删除临时生成的unit_temp、it_temp目录,不删除也不会影响后续报告生成。
方案2:关闭结果目录自动清理(配置更简单)
VSTest@2提供了cleanResultsFolder参数,默认值为true(执行前清空结果目录),关闭该参数即可避免前序任务的结果被删除,步骤如下:
- 测试任务执行前,提前清空
TestResult目录的历史残留 - 两个VSTest任务都配置相同的
resultsFolder路径,均设置cleanResultsFolder: false - 通过命令行参数给两个任务指定不同的测试结果文件名,避免同名文件覆盖
核心配置片段:
# 单元测试任务核心配置 - task: VSTest@2 inputs: # 其余testAssemblyVer2、searchFolder等配置和上述方案一致 codeCoverageEnabled: true resultsFolder: '$(Build.SourcesDirectory)\SiprotecUnitTestSolution\TestResult' cleanResultsFolder: false # 关闭自动清理 otherConsoleOptions: '--collect:"Code Coverage" /ResultsFile:unit_test_result.trx' # 指定独立结果文件名 # 集成测试任务核心配置 - task: VSTest@2 displayName: 'ITTest' inputs: # 其余testAssemblyVer2、searchFolder等配置和上述方案一致 codeCoverageEnabled: true resultsFolder: '$(Build.SourcesDirectory)\SiprotecUnitTestSolution\TestResult' cleanResultsFolder: false # 关闭自动清理 otherConsoleOptions: '--collect:"Code Coverage" /ResultsFile:it_test_result.trx' # 指定独立结果文件名
覆盖率报告生成说明
所有测试结果汇总到TestResult目录后,直接使用ReportGenerator任务扫描该目录下所有.coverage(或转换后的.coveragexml)文件,工具会自动合并多份覆盖率数据,生成包含单元测试、集成测试覆盖范围的完整报告,不需要额外做手动合并操作。
内容的提问来源于stack exchange,提问作者Naveen Kumar N
相关产品推荐
相关产品推荐

