检测代码覆盖率工具搭建

一、工程配置

1、build settings设置两个instrument program flow和generate legacy test coverage files

2、info设置
Application support iTunes files sharing:可以使用iTunes或者iTools导出沙盒里数据
Application does not run in background:按HOME键后,手机会正常退出,退出时调用__gcno_flush()函数生成gcda文件。

二、代码

1、通过cocoaPods把XcodeCoverage导入到项目中
Podfile文件中添加pod 'XcodeCoverage', ‘~>1.0'
终端执行:pod install
2、在APPDelegate.m中添加如下代码

- (void)applicationDidEnterBackground:(UIApplication *)application {

#if NT_COVERAGE
    
#if !TARGET_IPHONE_SIMULATOR
    
    NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
    
    setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1);
    setenv("GCOV_PREFIX_STRIP", "13", 1);
    
#endif
    
    extern void __gcov_flush(void);
    
    __gcov_flush();
    
#endif
}

三、在模拟器中实验:

1、运行程序,测试一段时间
2、点击home键,即command+shift+H
3、cd 到项目/Pod/XcodeCoverage目录下

4、终端执行:./getcov -s

5、等待一会,即会生成相应文件(会自动打开),可自己双击下图html文件查看。

效果如下图:

4、在手机上实验:

1、在main.m中添加代码:

int main(int argc, char * argv[]) {
    @try {
        
        NSString *documentsDirectory = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES).lastObject;
        
        setenv("GCOV_PREFIX", [documentsDirectory cStringUsingEncoding:NSUTF8StringEncoding], 1);
        setenv("GCOV_PREFIX_STRIP", "13", 1);
        
        @autoreleasepool {
            return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
        }
    }@catch (NSException *exception) {
        NSLog ( @"Stack Trace: %@" , [exception callStackSymbols ]);
    }
}

2、运行安装在手机上,测试一段时间后
3、获取所有gcno文件文件:在我们在电脑的以下目录里去拷贝gcno文件, 把这些文件全选拷贝,复制到桌面的一个文件夹下,例如起名为coverage(其他地方也可以)

~/Library/Developer/Xcode/DerivedData/{project_dir}/Build/Intermediates/{target_name}.build/Debug-iphoneos/{target-name}.build/Objects-normal/arm64/

例如我的:

‎⁨Macintosh HD⁩ ▸ ⁨用户⁩ ▸ ⁨wanggang⁩ ▸ ⁨资源库⁩ ▸ ⁨Developer⁩ ▸ ⁨Xcode⁩ ▸ ⁨DerivedData⁩ ▸ ⁨CustomLearn-bqfkckqonrnkamepjgvlhmelxper⁩ ▸ ⁨Build⁩ ▸ ⁨Intermediates.noindex⁩ ▸ ⁨CustomLearn.build⁩ ▸ ⁨Debug-iphoneos⁩ ▸ ⁨CustomLearn.build⁩ ▸ ⁨Objects-normal⁩

4、获取gcda所有文件:这个文件在沙盒路径Documents下。全选拷贝,复制到和gcno同一个文件夹下(coverage)。

不知道怎么获取沙盒文件?

下载之后,显示包内容即可得到。

5、gcno文件和gcda文件都已经放到一个文件夹下了,然后要生成HTML格式的报告。

MAC 安装LCOV:

  • 终端输入:不用考虑路径
ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)" < /dev/null 2> /dev/null  
  • 接着运行:brew install lcov

安装成功!然后

(1) 利用lcov命令生成info文件:终端执行如下命令

格式:locv -c -d 【放gcda、gcno的文件夹路径】 -b 【测试覆盖率项目的跟路径】 -o 【你想存放info文件的路径】

例如:

lcov -c -d /Users/wanggang/Desktop/coverage -b /Users/wanggang/Desktop/CustomLearn -o /Users/wanggang/Desktop/coverage/wang.info

(2)利用lcov的genhtml命令生成html报告:终端执行如下命令

格式:genhtml -t 【自定义报告标题】 【上一步生成的info文件路径】-o 【输出报告路径】

例如:

genhtml -t "CustomLearn" /Users/wanggang/Desktop/coverage/wang.info -o /Users/wanggang/Desktop/coverage/report317

即可生成如下文件

双击打开,即可看到结果:

如果有多个人进行测试,可以把他们的覆盖率整合叠加起来:
lcov -a 【第一个人的info文件】 -a 【第二个人的info文件】-a 【第三个人的info文件】…… -o 【新的info文件】

参考:
https://blog.csdn.net/duan5858/article/details/54670421
https://blog.csdn.net/conghuaxiansheng/article/details/72179483
https://www.jianshu.com/p/2a1102c54b91

你可能感兴趣的:(检测代码覆盖率工具搭建)