如何在Swift Packages中排除SwiftUI Previews不计入代码覆盖率?
Swift Packages 排除预览代码覆盖率的解决方案
以下是几种可行的方法,帮你把SwiftUI预览从单元测试的代码覆盖率统计中排除:
方法1:用自定义编译条件隔离预览代码
这是最通用的方案,不管用Xcode还是命令行swift test都能生效:
- 在
Package.swift的测试目标中添加自定义编译标志:
.testTarget( name: "YourPackageTests", dependencies: ["YourPackage"], swiftSettings: [ .define("TESTING") // 添加这个编译定义 ] ),
- 给所有预览代码加上编译条件判断,测试时不编译预览:
#if !TESTING struct YourView_Previews: PreviewProvider { static var previews: some View { YourView() } } #endif
这样测试套件运行时,预览代码不会被编译,自然不会计入覆盖率统计。
方法2:将预览文件单独存放并通过Package配置排除
把所有预览文件放到单独的目录(比如Previews/),然后在Package.swift中配置主目标仅在非测试环境下包含该目录:
.target( name: "YourPackage", dependencies: [], sources: [ "Sources/", // 仅在Debug非测试、Release环境下包含预览目录 .init(path: "Previews/", condition: .when(configuration: .release)), .init(path: "Previews/", condition: .when(configuration: .debug, excludeWhen: .testing)) ] ),
这种方式能让代码结构更清晰,不用给每个预览加编译条件。
方法3:通过Xcode Scheme手动排除(仅Xcode环境有效)
如果只在Xcode中开发和测试,可以直接修改Scheme的覆盖率配置:
- 打开Scheme编辑器:
Product > Scheme > Edit Scheme - 切换到
Test选项卡,选择Coverage标签 - 展开你的Swift Package目标,找到所有带
_Previews后缀的文件,取消勾选它们
这样Xcode统计覆盖率时会自动忽略这些预览文件。
内容的提问来源于stack exchange,提问作者Cyklist
相关产品推荐
相关产品推荐

