如何在Xcode单元测试的iOS代码覆盖率报告中排除第三方库
如何在Xcode单元测试覆盖率报告中排除第三方库
我之前做iOS单元测试的时候也碰到过这个糟心的问题——开启代码覆盖率后,Pods里的第三方库甚至一些系统依赖都混进报告里,完全干扰了我们自己代码的覆盖率统计。折腾了几种方法,亲测有效,给你整理下:
方法1:用Test Plan精准控制排除规则(推荐,Xcode 11+)
如果你的项目用了Test Plan(没有的话建议新建一个,管理测试更方便),这是最直观的方式:
- 打开你的
.xctestplan文件 - 切换到「Coverage」标签页
- 在「Include/Exclude Patterns」区域,点击「+」按钮添加排除规则
- 输入你要排除的路径,比如:
- 排除所有Pods:
Pods/** - 排除单个第三方库:
Alamofire/**
- 排除所有Pods:
- 确保规则的类型是「Exclude」,保存后重新运行测试,覆盖率报告就会自动过滤掉这些内容
方法2:通过Build Script修改覆盖率配置
如果是老版本Xcode(Xcode 10及以下),或者需要更灵活的自定义,可以用脚本的方式:
- 打开项目的主Target,切换到「Build Phases」标签
- 点击左上角的「+」,选择「New Run Script Phase」
- 将下面的脚本粘贴进去:
# 生成覆盖率排除配置文件 echo "Setting up code coverage exclusions..." XCOVCONFIG_FILE="${BUILT_PRODUCTS_DIR}/${INFOPLIST_PATH%.*}.xcovconfig" cat > "$XCOVCONFIG_FILE" <<EOF exclude_patterns = Pods/**, Vendor/** EOF # 告诉Xcode使用这个配置 export LLVM_COV_FLAGS="-config $XCOVCONFIG_FILE"
- 把这个Run Script Phase拖到「Dependencies」之后、「Compile Sources」之前,重新运行测试即可
方法3:关闭第三方库的覆盖率收集(适合CocoaPods项目)
如果你的第三方库是通过CocoaPods引入的,可以直接在Podfile里配置,从根源上禁止它们生成覆盖率数据:
- 打开项目根目录的Podfile,添加下面的代码:
post_install do |installer| installer.pods_project.targets.each do |target| target.build_configurations.each do |config| # 关闭第三方库的代码覆盖率 config.build_settings['CLANG_ENABLE_CODE_COVERAGE'] = 'NO' end end end
- 执行
pod install,重新编译项目后,第三方库就不会出现在覆盖率报告里了
方法4:Scheme设置中取消第三方库Target
这个方法比较直接,但如果第三方库很多的话操作起来麻烦:
- 点击Xcode顶部的Scheme,选择「Edit Scheme」(或者用快捷键
Cmd + <) - 切换到「Test」选项卡,选择「Options」标签
- 找到「Code Coverage」部分,点击「Configure...」
- 在弹出的窗口里,取消所有第三方库对应的Target勾选,只保留你自己的App Target和Test Target,保存后重新运行测试
小提示
如果排除后还是有第三方库的内容,检查下是否有嵌套的依赖,或者调整排除规则的路径(比如用更具体的路径,或者通配符*来匹配)。
内容的提问来源于stack exchange,提问作者Shiwali




