gcov+lcov进行ios代码覆盖率检查

达芬奇密码2018-07-25 10:24

一、           什么是代码覆盖率

代码覆盖是软件测试中的一种对于代码质量的度量,描述了程序中源代码被测试的比例和程度,这个比例值就称为代码覆盖率。从定义来看,代码覆盖是一种软件测试技术,其基于白盒测试,同时是一种动态测试方法,即必须通过代码的执行才能得到测试结果。而且通过动态的调整代码测试的测试样本,可以提高代码覆盖率,从而提高代码质量。

二、           代码覆盖率的评价标准

1、函数覆盖率:程序中的每个函数或者子函数都被调用过吗

2、指令/语句覆盖率:程序中的每个节点node或者每个语句都被执行过吗

3、判断/分支覆盖率:若用控制流图表示程序,有执行到控制流图中的每一个边吗?例如控制结构中所有if或者switch case指令都有执行到逻辑运算式成立及不成立的情形吗?

4、条件覆盖率:也称为断定覆盖,每一个逻辑运算式中的每一个条件(无法再分解的逻辑运算式)是否都有执行到成立及不成立的情形吗?条件覆盖率成立不表示判断覆盖率一定成立。

5、条件/判断覆盖率:需同时满足判断覆盖率和条件覆盖率。

三、           如何使用gcov+lcov实现代码覆盖率测试

1、lcov是什么

gcov伴随gcc 发布。gcc编译加入-fprofile-arcs -ftest-coverage 参数生成二进制程序,执行测试用例生成代码覆盖率信息。

具体的实现原理见如下网页:

http://blog.csdn.net/diy534/article/details/7099049

lcovgcov 结果展现的一个前端,可以将覆盖率信息转换成html展现。

2、lcov的安装

brew install lcov

3、整个使用gcov+lcov来实现代码覆盖率测试的流程图如下所示:

4、使用lcovgcov分为几个阶段:

1)编译工程并且收集覆盖信息

xcodebuild test

-IDECustomDerivedDataLocation="out/build_ccov" GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES

其中,-IDECustomDerivedDataLocation="out/build_ccov":指定构建结果的位置,如果不指定放在默认位置:~/Library/Developer/Xcode/DerivedData/

GCC_GENERATE_TEST_COVERAGE_FILES=YES GCC_INSTRUMENT_PROGRAM_FLOW_ARCS=YES:这两个flag会生成覆盖信息

2)lcov格式化

lcov --capture --directory "out/build_ccov/ConnectSDK/Build/Intermediates/xxxx.build/" "Debug-iphonesimulator/xxxx.build/Objects-normal/xxxx/" --output-file "out/coverage.info"

lcov --remove "out/coverage.info" 'Frameworks/*'  --output "out/coverage-csdk.info"

genhtml "out/coverage-csdk.info" --output-directory "out/coverage_report"

其中,lcov --capture --directory --output-file 会生成分析结果

lcov –remove会忽略第三方目录

genhtml会生成html报告

3)html报告

lcov报告可以用 HTML Publisher plugin 展示在jenkins

结果如下:

其中,左边Directory部分可以点击打开,会有具体的覆盖信息。

在查资料的过程中,有人说gcovr同样也可以进行gcov结果的展示

使用方法如下:

gcovr--object-directory="out/build_ccov/ConnectSDK/Build/Intermediates/xxxx.build/Debug-iphonesimulator/xxxx.build/Objects-normal/xxxx/" \

--root=. --xml-pretty --gcov-exclude='.*#(?:ConnectSDKTests|Frameworks)#.*' --print-summary --output="out/coverage.xml"

其中,--gcov-exclude 会忽略第三方的frameworks目录

这篇文章只是为了需要ios代码检查的人提供一个

本文来自网易实践者社区,经作者孟志斌授权发布。