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

Azure DevOps原生iOS应用流水线:如何查看XCTest测试结果与覆盖率报告?

解决Azure DevOps流水线中XCTest测试结果与代码覆盖率查看问题

一、查看XCTest测试结果

XCTest默认生成.xcresult格式的测试结果,无法直接被PublishTestResults@2识别,需要先将其转换为JUnit XML格式,再进行发布。以下是完整步骤:

  1. 运行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
    
  2. 转换测试结果为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'
    
  3. 发布测试结果
    用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发布:

  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'
    
  2. 发布代码覆盖率
    发布转换后的覆盖率报告:

    - 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 18:40:05