native:
简单地用gcov来进行检查。配置方法如下:
1. 代码编译时候加上两个CFLAG:
export GCOV_OPTION = -fprofile-arcs -ftest-coverage
LOCAL_CFLAGS := $(GCOV_OPTION)
2. 加上对gcov链接:
LOCAL_LDLIBS += -lgcov
3. 设置gcov文件的输出路径
setenv(“GCOV_PREFIX”, “path”, 1);
setenv(“GCOV_PREFIX_STRIP”, “14″, 1); // 14是我要去掉的目录级别,不要的话就不设置这个变量
4. 退出的时候在native调用exit(0),这时开始写结果文件到$(GCOV_PREFIX)
5.然后从path里面拷贝出所有.gcda文件到编译输出目录(r3和r4的ndk不同),另外也拷贝源码到一起,然后运行ndk里面的arm-eabi-gcov xxx.cpp即可得到xxx.cpp.gcov文件,打开就能看到覆盖结果,可惜要一个文件一个文件地看,比较麻烦,暂时不知道有没有图形前端可以批量处理并且查看结果。
http://blog.chinaunix.net/space.php?uid=21961753&do=blog&id=1810652
可以使用信号的方式以保持进程还在运行中能输出gcov信息。 比如可定义SIGUSR2的信号处理函数中调用__gcov_flush()来输出gcov而不用退出进程。
在其信号处理函数中调用:
extern void __gcov_flush();
__gcov_flush();
在命令行可用kill -12 proc_pid 来触发这个信号
对应的*.gcno文件在编译的时候生成。
-ftest_coverage: 增加文件行号等索引
-fprofile_arcs: 使gcc创建一个程序的流图,之后找到适合图的生成树。只有不在生成树中的弧被操纵(instrumented):gcc添加了代码来清点这些弧执行的次数。当这段弧是一个块的唯一出口或入口时,操纵工具代码(instrumentation code)将会添加到块中,否则创建一个基础块来包含操纵工具代码。
gcov 生成文本统计结果和带 line-count 标注的源代码:gcov srcfile
lcov 生成较正式的 HTML 报告:
1
2
|
lcov -c -d srcfile_dir -o srcfile.info
genhtml -o report_dir srcfile.info
|
注意:另外,编译选项中最好加入 -g3 -O0,前者是为了增加调试信息,后者是为了禁用优化,免得覆盖率测试不准确。
http://blog.linezing.com/2011/03/%e4%bd%bf%e7%94%a8gcov%e5%ae%8c%e6%88%90%e4%bb%a3%e7%a0%81%e8%a6%86%e7%9b%96%e7%8e%87%e7%9a%84%e6%b5%8b%e8%af%95: gcov/lcov
http://hi.baidu.com/liujianzhang85/item/afd275c78506f16189ad9edb: android flag
http://www.cnblogs.com/liuweijian/archive/2009/12/30/1635870.html:kill 命令
http://muxu303.blog.163.com/blog/static/512801920117245631746/: 还提到genhtml
http://blog.chinaunix.net/uid-7921481-id-3316991.html
http://www.linuxidc.com/Linux/2011-05/36544.htm: 讲lcov/genhtml用法
lcov --capture --directory . --output-file test.info --test-name test
genhtml test.info --output-directory output --title "a simple test" --show-details --legend
http://blog.csdn.net/denarina/article/details/6184531
java(emma)
代码覆盖率的作用主要是用来查看测试用例执行完毕后,有哪些代码尚未覆盖到,未覆盖到的代码通常意味着未覆盖到的功能或场景,对于Andriod程序来说,好像国内聊到这个领域的文章不多,这里记录下来供大家参考。
因为Andriod程序实际上就是Java程序,这里先不谈Andriod native C程序的代码覆盖率收集(后面的文章会讲到,其实就是用gcov做的),Java程序的代码覆盖率统计可以使用一个开源软件Emma,Emma并不需要源码就可以统计代码覆盖率 。这是因为统计代码覆盖率的做法有两种(参看以前的文章:):
1、修改程序源代码,添加统计代码覆盖率的代码,例如gcov采用的就是这种做法。
2、修改最终程序,比如Emma就是修改Java class的字节码Oolong代码。为了能够将统计到的代码覆盖率结果追溯到源代码,一般是将Java编译成调试(Debug)版,做法是:Emma在每个Oolong跳转代码前加入统计覆盖率的代码,而调试版的class,里面会有.source, .line. .var这些指令,告诉调试器字节码与Java源代码、Java变量与Oolong变量的数字引用的映射关系,这种做法的好处是,只要你的程序最终会生成Java字节码,例如Scala之类的程序,生成的调试版都可以用Emma修改,达到统计代码覆盖率的目的。Java虚拟机对调试的支持,请参考书籍《Programming for the Java™ Virtual Machine》第7章里的描述。
因为Andriod程序在部署到设备之前,会有个程序(dx)将Java字节码翻译成Andriod虚拟机里的字节码,所以可以在翻译之前使用Emma修改class文件,再打包。
实际上Andriod提供了一个ant的 build文件,里面就封装了这个功能,我这里将这个脚本做的事情挖了出来,解释一下各步骤。在解释之前,先看看如何用ant编译一个覆盖率统计版:
1、从eclipse的andriod工程里生成一个ant的build文件,andriod-app就是工程名:
android update project -p android-app
2、将eclipse的andriod测试工程也转换成ant工程,-m选项指定了测试工程对应的主andriod工程的位置,而android-test就是测试工程名:
android update test-project -m ../android-app -p android-test
3、执行下面的命令,编译、执行单元测试、收集覆盖率:
ant clean emma debug install test
4、在设备上,/data/data/<package name>/目录里,有一个files文件夹里有coverage.ec文件,即记录了代码覆盖率信息,但这个信息还需要跟源码做一次映射才能看到哪些代码行已覆盖。
5、将上面coverage.ec文件拷贝到andriod主工程的bin文件夹里,这个文件夹里有一个文件名coverage.em,里面记录了修改过的字节码与源代码的映射关系。
6、要查看代码覆盖率时,执行下面的命令(andriod SDK里以及自带了emma.jar),下面命令里的sp参数即指定了 源代码的位置:
java -cp ~/android-sdk/tools/lib/emma.jar emma report -r html -in coverage.em -in coverage.ec -sp ~/<andriod-app>/src/
这里我们把ant命令分解(假设已经将andriod eclipse工程转换成ant工程了),实际上执行下面几个命令就可以了,下例中~/research/multiplatformdemoproject就是andriod的主工程路径:
cd ~/research/multiplatformdemoproject/
# 编译成调试版
ant debug
# 在打包成dex文件之前,修改class字节码
cd bin
java -cp ~/android-sdk/tools/lib/emma.jar emma instr -ip classes -d instrumented
# 将修改成覆盖率统计版的class字节码打包成andriod虚拟机文件
~/android-sdk/platform-tools/dx --dex --debug --no-optimize --output=classes.dex instrumented
~/android-sdk/platform-tools/aapt package -v -f -M /home/shiyimin/research/multiplatformdemoproject/AndroidManifest.xml -S /home/shiyimin/research/multiplatformdemoproject/res -I /home/shiyimin/android-sdk/platforms/android-8/android.jar -F multiplatformdemoproject.unsigned.apk /home/shiyimin/research/multiplatformdemoproject/bin/
# 签名
jarsigner -keystore ~/.android/debug.keystore -storepass android -keypass android -signedjar multiplatformdemoproject.signed.apk multiplatformdemoproject.unsigned.apk androiddebugkey
~/android-sdk/tools/zipalign 4 multiplatformdemoproject.signed.apk multiplatformdemoproject.apk
# 部署主程序到设备上
~/android-sdk/platform-tools/adb install multiplatformdemoproject.apk
# 编译测试用例
cd tests
ant debug
# 部署并且执行测试用例
~/android-sdk/platform-tools/adb install multiplatformdemoproject.test-debug.apk
~/android-sdk/platform-tools/adb shell am instrument -w -e coverage true cc.iqa.studio.demo.test/android.test.InstrumentationTestRunner
# 查看代码覆盖率结果报告
cd http://www.cnblogs.com/bin/
~/android-sdk/platform-tools/adb pull /data/data/cc.iqa.studio.demo/files/coverage.ec .
java -cp ~/android-sdk/tools/lib/emma.jar emma report -r html -in coverage.em -in coverage.ec -sp ~/research/multiplatformdemoproject/src/
下面是几个截图:
关于ant(用于编译,打包,签名):
http://dev.10086.cn/cmdn/wiki/index.php?edition-view-5456-1.html
http://www.cnblogs.com/wangtianxj/archive/2011/06/29/2093674.html
http://zhidao.baidu.com/question/192287727.html&__bd_tkn__=7aac4826203d88304457bb71b5a93af398178deb8078338d51fed8133ea5c69d362ad36bb4bcda3b39bb3949f6bbe47087ac3af56e60b1f4e7eb60157955ff309560aefa590f03de01252778a335cb7f4e01ea057f2ccbfcd14537080521432ec8177b3040c0daac9c7ef9accbdc8c0ace3325f548ab
http://wenku.baidu.com/view/1549006ba45177232f60a261.html: 详细