0%

iOS单元测试数据统计

说明

苹果在Xcode11版本中对单元测试结果文件(.xcresult*文件)及相关命令(xccov view等)有较大更新,请参考 https://developer.apple.com/documentation/xcode_release_notes/xcode_11_release_notes?language=objc。主要的变化是 *.xcresult 文件中不再包含 .xccovarchive 文件。

本文涉及的所有脚本均托管在GitHub项目UnitTestParser中。

目录


单元测试基础

单元测试命令

执行如下命令即可进行单元测试。单元测试过程中产生的文件存放在BUILD_DIR目录。

1
2
3
4
5
6
7
# resultBundleVersion 为可选参数,为了防止后续版本更新导致结果文件变化,建议加上这个参数

# for xcodeproj
xcodebuild test -project Demo.xcodeproj -scheme Demo -derivedDataPath "${BUILD_DIR}/" -destination "${SIMULATOR_PLATFORM}" -resultBundlePath "${XCRESULT_PATH}" -resultBundleVersion 3

# for xcworkspace
xcodebuild test -workspace Demo.xcworkspace -scheme Demo -derivedDataPath "${BUILD_DIR}/" -destination "${SIMULATOR_PLATFORM}" -resultBundlePath "${XCRESULT_PATH}" -resultBundleVersion 3

SIMULATOR_PLATFORM指定使用的模拟器类型,如。不同机器上可用的模拟器类型不同,如 platform=iOS Simulator,OS=13.4,name=iPhone 11,不同机器上可用的模拟器类型不尽相同,可以通过如下命令获取可用的模拟器列表

1
xcrun simctl list

XCRESULT_PATH指定单元测试结果文件(.xcresult文件)的存放路径,这个参数是Xcode11的命令行工具中新增加的,便于直接获取到结果文件。使用Xcode10及之前版本时,我们必须去BUILD_DIR对应的目录中找这个文件。(其实在Xcode11中,.xcresult文件在BUILD_DIR对应的目录中也会有一份拷贝,不过当然是直接指定结果文件路径来的方便。)

单元测试结果

单元测试执行完成之后,就可以在XCRESULT_PATH找到产生的结果文件,也就是 .xccresult 文件。该文件打开后的目录格式为:

1
2
3
4
5
6
.
├── Data/
│ ├── data0~xxx
│ └── data0~xxx

└── Info.plist

通过解析这些文件,就可以获得单元测试概况、代码覆盖率等基本的单元测试数据。

.xcresult 文件也支持直接在Xcode中打开,双击打开后就可以在Xcode中看到本次单元测试的详情。

单元测试概况统计

单元测试概况统计需要使用官方提供的xcrun xcresulttool工具。

首先需要获取到出json格式的数据,并从json数据中解析出获取单元测试报告所需的id

1
2
# 解析成json数据,便于下一步获取id
xcrun xcresulttool get --format json --path path/to/xcresult_file

从json数据中获取id需要一连串复杂的json字段解析,这里我参考了fastlane的xcresult解析脚本,不再自己重新写一遍id提取逻辑。

获取到id之后,就能进一步拿到详细的单元测试报告数据。

1
xcrun xcresulttool get --format json --path path/to/xcresult_file --id $id

执行上面的命令之后,又可以获取到了一份json数据,继续解析这份json数据,就可以拿到需要的单元测试总用例数、失败用例数、告警数、执行时长等数据。这里同样参考上面提到的fastlane的xcresult解析脚本

为了简化上述逻辑,UnitTestParser项目提供了 unitTestInfo.rb 来直接提取需要的数据。

1
ruby unitTestInfo.rb --xcresult-path=path/to/xcresult_file --output-file=/path/to/output_file

例如执行:

1
2
3
4
╰─± ruby ../UnitTestParser/unitTestInfo.rb --xcresult-path=result.xcresult --output-file=result.txt
单元测试用例数:15
失败单元测试用例数:0
单元测试运行总时长:0.48s

同时这些数据也会被写入到 result.txt 文件中,便于其他工具读取。

1
2
3
4
╰─± cat result.txt
15
0
0.48