先前调研覆盖率测试的时候,iOS是借助于XcodeCoverage插件来实现的,并且已经生成了覆盖率报告,但后来在实际项目中使用的时候,发现项目是使用Swift写的,XcodeCoverage又不支持swift覆盖率测试,后来调研了一下发现Swift项目通过一些配置,就可以生成覆盖率数据。
一,Swift覆盖率配置
为了方便总结,我们从网上下载一个示例Demo:GitHub - ChinaArJun/shopping-cart-Demo: IOS购物车: 用Swift 写的购物车Demo, shopping cart , swift 4.0
项目非常很简单,直接进行编译就可以了。
1,配置Other Swift Flags
在项目的"Build Settings"--->"Other Swift Flags"--->"Debug", 双击后面的配置项
将这两个配置添加进去:" -profile-generate 和 -profile-coverage-mapping ",注意不要改变原来的项目配置
2,设置覆盖率作用于所有的项目
"Product"--->"scheme"---->"edit scheme....",在打开的对话框中,勾选"Gather coverage for all targets".
3,添加LLVM相关定义
在swift项目中添加头文件,如:InstrProfiling.h,内容如下:
-
#ifndef InstrProfiling_h
-
#define InstrProfiling_h
-
-
#ifndef PROFILE_INSTRPROFILING_H_
-
#define PROFILE_INSTRPROFILING_H_
-
int __llvm_profile_runtime =
0;
-
void __llvm_profile_initialize_file(
void);
-
const
char *__llvm_profile_get_filename();
-
void __llvm_profile_set_filename(
const
char *);
-
int __llvm_profile_write_file();
-
int __llvm_profile_register_write_file_atexit(
void);
-
const
char *__llvm_profile_get_path_prefix();
-
#endif /* PROFILE_INSTRPROFILING_H_ */
-
-
-
#endif /* InstrProfiling_h */
创建一个 module.modulemap 文件并将所有内容导出为一个模块。
-
module InstrProfiling {
-
header
"InstrProfiling.h"
-
export *
-
}
4,在Swift项目中调用OC内容
事实上我们不能直接创建 module.modulemap,首先创建一个 module.c 文件然后重命名为 module.modulemap,它还可以帮助我创建一个 ShoppingCart-Bridging-Header 文件。
(1) 创建module.c文件
(2)创建Bridging Header文件
本项目中,我们没有引用第三方的OC类,此文件中可以不写内容。如果有引用,在此文件中添加对第三类的头文件的引用。Swift文件中就可以使用oc的类及函数。
(3)设置Badging Header文件
找到Build Setting配置下的"Object-C Bridging Header"项,看后面的值是没有刚刚创建的文件,如:
如果没有,双击打开一个弹层,将左侧的Bridging文件拖过来,自动填写相应的路径。
5, 在项目中添加生成覆盖率的操作
通常我们会在应用进入后台的时候,生成覆盖率数据,所以在AppDelegate.swift下的applicationDidEnterBackground函数中,添加如下操作:
-
let name =
"test.profraw"
-
let fileManager = FileManager.default
-
do {
-
let documentDirectory = try fileManager.url(
for: .documentDirectory,
in: .userDomainMask, appropriateFor:
nil, create:
false)
-
let filePath:
NSString = documentDirectory.appendingPathComponent(name).path as
NSString
-
__llvm_profile_set_filename(filePath.utf8String)
-
__llvm_profile_write_file()
-
print(
"文件路径:"+(filePath as String))
-
} catch {
-
print(error)
-
}
此段代码,会在应用进入到后台时,在Documents目录下生成覆盖率数据文件,test.profraw.
二,执行测试并获取覆盖率数据
经过上面的配置后,再配置一下证书,就可以将应用打包并安装到手机上。然后执行你需要的测试用例即可,然后将应用置入后台一会儿。
1,导出覆盖率数据:选择Xcode的"windows"---->"Devices and Simulators "在打开的对应框中选择手机设备;
2,选择应用,导出应用数据
选择『shoppingCart』---"Download container" 下载应用数据。
3,打开container,查找覆盖率数据
右击文件选择『显示包内容』--->AppData-->Doucuments--->就可以找到覆盖率数据文件。
将数据文件拷到指定的文件夹,就可以生成报告。
三,生成Swift覆盖率报告
1,收集生成覆盖率数据文件
(1)拷贝第二步生成的覆盖率数据文件,如:test.profraw;
(2)拷贝应用构建生成的可执行文件
路径:
~/Library/Developer/Xcode/DerivedData/shoppingCart-efmklxddypsuvfgiumzoyfnmnudr/Build/Products/Debug-iphoneos/shoppingCart.app/shoppingcart
2,生成覆盖率报告
(1)合并及转换覆盖率数据
xcrun llvm-profdata merge -sparse test.profraw -o test.profdata
(2)查看覆盖情况命令
xcrun llvm-cov show ./shoppingCart --instr-profile=test.profdata
(3)生成汇总报告
xcrun llvm-cov report ./shoppingCart -instr-profile=test.profdata
(4)生成HTML报告
xcrun llvm-cov show ./shoppingCart --instr-profile=test.profdata --format=html -use-color --output-dir ./coverage_report
(5) 生成XcodeCoverage报告
A, 生成info文件
xcrun llvm-cov export ./shoppingCart --instr-profile=test.profdata -use-color --format=lcov > ./newreport.info
B, 生成xcodecoverage报告
./lcov-1.14/bin/genhtml -o html ./newreport.info
C, 报告样式如下:
转载:https://blog.csdn.net/lionking0318/article/details/125819124