一、 什么是代码覆盖率
代码覆盖是软件测试中的一种对于代码质量的度量,描述了程序中源代码被测试的比例和程度,这个比例值就称为代码覆盖率。从定义来看,代码覆盖是一种软件测试技术,其基于白盒测试,同时是一种动态测试方法,即必须通过代码的执行才能得到测试结果。而且通过动态的调整代码测试的测试样本,可以提高代码覆盖率,从而提高代码质量。
二、 代码覆盖率的评价标准
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
lcov是gcov 结果展现的一个前端,可以将覆盖率信息转换成html展现。
2、lcov的安装
brew install lcov
3、整个使用gcov+lcov来实现代码覆盖率测试的流程图如下所示:
4、使用lcov和gcov分为几个阶段:
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代码检查的人提供一个
本文来自网易实践者社区,经作者孟志斌授权发布。