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

可以看到覆盖率

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

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