iOS Gcov 探测测试代码覆盖率

iOS Gcov 探测测试代码覆盖率

1. Xcode工程设置

首先配置Xcode工程,生成对应的coverage文件(GCNO文件)

instrument program flow : yes
generate legacy test coverage files : yes
xcode_setting.png

2.真机运行设置

为了能够在真机上把文件取出来,需要配置plist打开文件共享

application supportsitunesfiles sharing=yes
xcode_setting_1.png

3.代码修改

3.1 设置目标属性

首先要设置GCDA文件保存的位置:

NSString *covFilePath = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/coverage_files"];
setenv("GCOV_PREFIX", [covFilePath cStringUsingEncoding: NSUTF8StringEncoding], 1);
setenv("GCOV_PREFIX_STRIP", "1", 1);

这里通过设置环境变量GCOV_PREFIX设置路径。而GCOV_PREFIX_STRIP设置源文件绝对路径中去掉多少级别。比如设置为1的话直接去掉了Users目录:

CHANGZENG-MC0:tmp apollo$ tree coverage_files/
coverage_files/
└── apollo
    └── Library
        └── Developer
            └── Xcode
                └── DerivedData
                    └── TestGCOV-cxksfhbrmyzmdgbbxfollivoxxry
                        └── Build
                            └── Intermediates
                                └── TestGCOV.build
                                    └── Debug-iphoneos
                                        └── TestGCOV.build
                                            └── Objects-normal
                                                └── arm64
                                                    ├── AppDelegate.gcda
                                                    ├── ViewController.gcda
                                                    └── main.gcda

13 directories, 3 files
CHANGZENG-MC0:tmp apollo$ pwd
/Users/apollo/Desktop/tmp

3.2 生成文件

要生成.gcda文件,还需要在执行测试代码的最后调用

void __gcov_flush(void);

该函数是个内置函数,在系统库中,所以只要extern一下就可以调用:

extern "C" void __gcov_flush(void);

比如代码:

extern "C" void __gcov_flush(void);

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    [self testIfEles];
    __gcov_flush();
}

- (void) testIfEles {
    int con = 1;
    int num = 0;
    if (con) {
        num ++;
    } else {
        num --;
    }
    
    NSLog(@"num is %d", num);
}   

会生成GCDA文件:

AppDelegate.gcda    ViewController.gcda main.gcda

4. 取出GCNO文件 和GCDA文件

4.1 GNCO

GCNO文件是在编译期间生成的类似符号表的文件,在Xcode的Product里面可以找到构建时候的目录,在这个目录中如下的路径:
/Users/apollo/Library/Developer/Xcode/DerivedData/TestGCOV-cxksfhbrmyzmdgbbxfollivoxxry/Build 路径中找到:
Intermediates/TestGCOV.build/Debug-iphoneos/TestGCOV.build/Objects-normal/ 下面的arm64或者386等架构平台下找到GCNO文件:

CHANGZENG-MC0:arm64 apollo$ ls *.gcno
AppDelegate.gcno    ViewController.gcno main.gcno

4.2 GCDA

如果是模拟器运行,上面的covFilePath就是对应的路径位置,直接打开即可。如:

CHANGZENG-MC0:Documents apollo$ pwd
/Users/apollo/Library/Developer/CoreSimulator/Devices/DE6523B3-1718-4541-B156-23819BFE49DC/data/Containers/Data/Application/03A33ECA-4D66-4C4A-8796-9E78E107305C/Documents
CHANGZENG-MC0:Documents apollo$ ls
coverage_files
CHANGZENG-MC0:Documents apollo$ ls coverage_files/
AppDelegate.gcda    ViewController.gcda main.gcda

如果是真机,通过上面的plist设置,可以打开iTunes。然后在设备的APP里面看到有共享文件的App:

itunes.png

将文件导出来,就可以得到GCDA文件。

5.采用LCOV分析

5.1 lcov

安装lcov:

http://ltp.sourceforge.net/coverage/lcov.php下载lcov文件。比如Mac下,把目录解压后,把bin目录加入到bash_profile中:

## lcov
export PATH=$PATH:/Users/apollo/Software/lcov-1.13/bin

5.2 生成html文件

将上面的GCNO和GCDA文件copy到同一个目录下,然后执行:

lcov -c -d . -o TestGCOV.info

这里-d指定就是上面文件所在位置。 -o表示输出文件:

CHANGZENG-MC0:gfile apollo$ lcov -c -d . -o TestGCOV.info
Capturing coverage data from .
Found LLVM gcov version 8.1.0, which emulates gcov version 4.2.0
Scanning . for .gcda files ...
Found 3 data files in .
Processing AppDelegate.gcda
Processing main.gcda
Processing ViewController.gcda

然后在使用命令 genhtml生成html文件:

CHANGZENG-MC0:gfile apollo$ genhtml -o html TestGCOV.info
Reading data file TestGCOV.info
Found 4 entries.
Found common filename prefix "/Users/apollo/Work/Repos/tc-svn.tencent.com/GcloudServices_proj/trunk/gcloud_voice/gcov/iOS/TestGCOV"
Writing .css and .png files.
Generating output.
Processing file TestGCOV/AppDelegate.h
Processing file TestGCOV/main.m
Processing file TestGCOV/ViewController.m
Processing file TestGCOV/AppDelegate.m
Writing directory view page.
Overall coverage rate:
  lines......: 69.0% (20 of 29 lines)
  functions..: 46.2% (6 of 13 functions)

在输出目录-o表示的html文件夹中,用浏览器打开index.html文件:

xcode_lcov.png

可以看到覆盖率

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,390评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,821评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,632评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,170评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,033评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,098评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,511评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,204评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,479评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,572评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,341评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,893评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,171评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,486评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,676评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • 一、xcode使用模拟器,gcov,lcov进行测试覆盖率收集 效果: •ios会为项目中每个类生成2个文件 gc...
    静jingjing阅读 4,791评论 4 11
  • 前言 Update [20160725] Facebook 官方提供了一个可以生成React Starter项目的...
    令狐葱001阅读 1,638评论 0 1
  • 作者:津鱼蛋 1、回想去年,工作后遇到的第一次困境,非常焦虑。想着坐车松口气听听广播调节下,这边想那边从包里掏...
    津鱼蛋阅读 458评论 0 0
  • 在这个世界上,只要我努力过能得到我想要的东西我就觉得是公平。即使别人得到时是多么轻而易举。
    QYsomnus阅读 101评论 0 0