android 查看代码覆盖率

来源:互联网 发布:软件著作权转让费用 编辑:程序博客网 时间:2024/05/23 13:26

 

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: 详细

 

原创粉丝点击