Azure DevOps原生iOS应用流水线:如何查看XCTest测试结果与覆盖率报告?
解决Azure DevOps流水线中XCTest测试结果与代码覆盖率查看问题
一、查看XCTest测试结果
XCTest默认生成.xcresult格式的测试结果,无法直接被PublishTestResults@2识别,需要先将其转换为JUnit XML格式,再进行发布。以下是完整步骤:
运行XCTest并生成结果包
使用Xcode@5任务执行测试,指定结果包输出路径:- task: Xcode@5 inputs: actions: 'test' scheme: 'YourAppScheme' # 替换为你的Scheme名称 sdk: 'iphonesimulator' destination: 'platform=iOS Simulator,name=iPhone 15' # 按需选择模拟器 configuration: 'Debug' xcWorkspacePath: '**/YourApp.xcworkspace' # 替换为你的工作区路径 args: '-resultBundlePath $(System.DefaultWorkingDirectory)/test-results/TestResults.xcresult' useXcpretty: false转换测试结果为JUnit XML
使用xctest2junit工具将.xcresult转换为JUnit格式,先通过gem安装工具再执行转换:- script: | gem install xctest2junit xctest2junit $(System.DefaultWorkingDirectory)/test-results/TestResults.xcresult $(System.DefaultWorkingDirectory)/test-results/junit displayName: 'Convert XCTest results to JUnit XML'发布测试结果
用PublishTestResults@2发布转换后的JUnit报告:- task: PublishTestResults@2 inputs: testResultsFormat: 'JUnit' testResultsFiles: '**/junit/*.xml' searchFolder: '$(System.DefaultWorkingDirectory)/test-results' failTaskOnFailedTests: true testRunTitle: 'iOS App XCTest Results'
二、查看代码覆盖率报告
Xcode生成的覆盖率数据包含在.xcresult中,需要导出并转换为Cobertura格式后,通过PublishCodeCoverageResults@1发布:
生成Cobertura格式覆盖率报告
使用xcov工具直接从.xcresult生成Cobertura报告,先安装工具再执行:- script: | gem install xcov xcov --scheme YourAppScheme \ --workspace YourApp.xcworkspace \ --output_directory $(System.DefaultWorkingDirectory)/coverage \ --report cobertura displayName: 'Generate Cobertura coverage report'发布代码覆盖率
发布转换后的覆盖率报告:- task: PublishCodeCoverageResults@1 inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: '$(System.DefaultWorkingDirectory)/coverage/cobertura.xml' reportDirectory: '$(System.DefaultWorkingDirectory)/coverage' failIfCoverageEmpty: false
完整YAML示例
trigger: - main pool: vmImage: 'macos-latest' # 使用macOS代理,因为需要Xcode环境 steps: # 步骤1:运行XCTest并生成结果包 - task: Xcode@5 inputs: actions: 'test' scheme: 'YourAppScheme' sdk: 'iphonesimulator' destination: 'platform=iOS Simulator,name=iPhone 15' configuration: 'Debug' xcWorkspacePath: '**/YourApp.xcworkspace' args: '-resultBundlePath $(System.DefaultWorkingDirectory)/test-results/TestResults.xcresult' useXcpretty: false # 步骤2:转换测试结果为JUnit XML - script: | gem install xctest2junit xctest2junit $(System.DefaultWorkingDirectory)/test-results/TestResults.xcresult $(System.DefaultWorkingDirectory)/test-results/junit displayName: 'Convert XCTest results to JUnit XML' # 步骤3:发布测试结果 - task: PublishTestResults@2 inputs: testResultsFormat: 'JUnit' testResultsFiles: '**/junit/*.xml' searchFolder: '$(System.DefaultWorkingDirectory)/test-results' failTaskOnFailedTests: true testRunTitle: 'iOS App XCTest Results' # 步骤4:生成Cobertura覆盖率报告 - script: | gem install xcov xcov --scheme YourAppScheme \ --workspace YourApp.xcworkspace \ --output_directory $(System.DefaultWorkingDirectory)/coverage \ --report cobertura displayName: 'Generate Cobertura coverage report' # 步骤5:发布代码覆盖率 - task: PublishCodeCoverageResults@1 inputs: codeCoverageTool: 'Cobertura' summaryFileLocation: '$(System.DefaultWorkingDirectory)/coverage/cobertura.xml' reportDirectory: '$(System.DefaultWorkingDirectory)/coverage' failIfCoverageEmpty: false
注意事项
- 替换所有
YourAppScheme和YourApp.xcworkspace为你的项目实际信息。 - 使用Microsoft-hosted的
macos-latest代理时,默认已预装Ruby和Xcode,可直接执行gem install命令。 - 若需要自定义模拟器型号,修改
destination参数中的模拟器名称即可。
内容的提问来源于stack exchange,提问作者Lex
相关产品推荐
相关产品推荐

