收集Android程序测试代码覆盖率

简介:

代码覆盖率的作用主要是用来查看测试用例执行完毕后,有哪些代码尚未覆盖到,未覆盖到的代码通常意味着未覆盖到的功能或场景,对于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/


下面是几个截图:


 

 


本文转自 donjuan 博客园博客,原文链接: http://www.cnblogs.com/killmyday/archive/2012/07/23/2605708.html ,如需转载请自行联系原作者


相关文章
|
5月前
|
安全 Java Android开发
05. 【Android教程】Android 程序签名打包
05. 【Android教程】Android 程序签名打包
63 1
|
1月前
|
安全 Linux 网络安全
Kali渗透测试:远程控制程序基础
Kali渗透测试:远程控制程序基础
Kali渗透测试:远程控制程序基础
|
2月前
|
Java 测试技术 Android开发
Android性能测试——发现和定位内存泄露和卡顿
本文详细介绍了Android应用性能测试中的内存泄漏与卡顿问题及其解决方案。首先,文章描述了使用MAT工具定位内存泄漏的具体步骤,并通过实例展示了如何分析Histogram图表和Dominator Tree。接着,针对卡顿问题,文章探讨了其产生原因,并提供了多种测试方法,包括GPU呈现模式分析、FPS Meter软件测试、绘制圆点计数法及Android Studio自带的GPU监控功能。最后,文章给出了排查卡顿问题的四个方向,帮助开发者优化应用性能。
178 4
Android性能测试——发现和定位内存泄露和卡顿
|
2月前
|
测试技术 Shell Android开发
Android 性能测试初探 (六)
本节聊聊性能测试的最后一项- 流量,当然我所指的性能测试是针对大部分应用而言的,可能还有部分应用会关注网速、弱网之类的测试,但本系列文章都不去一一探讨了。
55 6
|
2月前
|
JavaScript 测试技术 Android开发
Android 性能测试初探 (四)
本文介绍了GPU在移动端性能测试中的重要性,并详细解释了过度绘制、帧率和帧方差的概念。针对GPU测试,文章列举了三项主要测试内容:界面过度绘制、屏幕滑动帧速率和平滑度。其中,过度绘制测试需遵循特定标准,而帧速率和平滑度测试则可通过软件或硬件方法实现。在软件测试中,使用Systrace插件和高速相机是两种常用手段。对于不同机型,帧率及帧方差的测试标准也需相应调整。
55 5
|
2月前
|
测试技术 Shell Android开发
Android 性能测试初探 (三)
本文承接《Android性能测试初探(二)》,深入探讨CPU与内存测试。介绍了移动端内存测试的重要性及其测试目标,并详细列举了不同状态下应用内存消耗情况的测试项目。此外,还提供了多种内存测试方法,包括使用`procrank`等工具的具体操作步骤。最后,文章也简要提及了CPU测试的相关内容,帮助读者更好地理解Android性能测试的关键要素。
53 5
|
1月前
|
安全 Java Linux
Kali渗透测试:通过Web应用程序实现远程控制
Kali渗透测试:通过Web应用程序实现远程控制
|
2月前
|
测试技术 Shell 定位技术
Android 性能测试初探 (五)
聊聊大家不常关注的测试项- 功耗
53 3
|
2月前
|
算法 测试技术 Android开发
Android 性能测试初探 (二)
上回大体介绍了下在 android 端的性能测试项,现在我们就细节测试项做一些阐述(包括如何自己 DIY 测试)
48 4
|
2月前
|
测试技术 API Android开发
Android 性能测试初探 (一)
Android 性能测试,跟pc性能测试一样分为客户端及服务器,但在客户端上的性能测试分为 2 类: 一类为 rom 版本的性能测试;一类为应用的性能测试。
53 3
下一篇
无影云桌面