51Testing软件测试网K'G1A$V K(Z9~ 代码覆盖率的作用主要是用来查看测试用例执行完毕后,有哪些代码尚未覆盖到,未覆盖到的代码通常意味着未覆盖到的功能或场景,对于Andriod程序来说,好像国内聊到这个领域的文章不多,这里记录下来供大家参考。
\;T,^8{LC7[0+\
k/U
dZ6m9h
]1?2`0 因为Andriod程序实际上就是Java程
序,这里先不谈Andriod native
C程序的代码覆盖率收集(后面的文章会讲到,其实就是用gcov做的),Java程序的代码覆盖率统计可以使用一个开源软件Emma,Emma并不需要源
码就可以统计代码覆盖率 。这是因为统计代码覆盖率的做法有两种(参看以前的文章:):
I9~/@!vT0C:@H*[)R2L~?(O7i0 1、修改程序源代码,添加统计代码覆盖率的代码,例如gcov采用的就是这种做法。
iG1l7XF.@*Zj0!C*`Iyn0
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章里的描述。
B(i.U~hN
a051Testing软件测试网s7g2]Mg2V `K 因为Andriod程序在部署到设备之前,会有个程序(dx)将Java字节码翻译成Andriod虚拟机里的字节码,所以可以在翻译之前使用Emma修改class文件,再打包。
0Z[m.e[t~+i$X }051Testing软件测试网 ^m5C4W9w`)ga 实际上Andriod提供了一个ant的 build文件,里面就封装了这个功能,我这里将这个脚本做的事情挖了出来,解释一下各步骤。在解释之前,先看看如何用ant编译一个覆盖率统计版:51Testing软件测试网_)S5h i&n:w
0i+spb"y x0 1、从eclipse的andriod工程里生成一个ant的build文件,andriod-app就是工程名:51Testing软件测试网Q,X@
V,`M
T*wX?V,q]}+gt0 androidupdate project -p android-app2、将eclipse的andriod测试工程也转换成ant工程,-m选项指定了测试工程对应的主andriod工程的位置,而android-test就是测试工程名:51Testing软件测试网 qyd7i `
51Testing软件测试网
rh I;a+rXu:Y android update test-project -m ../android-app -p android-test3、执行下面的命令,编译、执行单元测试、收集覆盖率:
'UB]L2D!yVG&oE06]tG:qc5I|0s0
ant clean emma debug install test4、在设备上,/data/data/<package
name>/目录里,有一个files文件夹里有coverage.ec文件,即记录了代码覆盖率信息,但这个信息还需要跟源码做一次映射才能看到
哪些代码行已覆盖。
w4^KI*h3l
}+[u051Testing软件测试网 r W/l3k_n 5、将上面coverage.ec文件拷贝到andriod主工程的bin文件夹里,这个文件夹里有一个文件名coverage.em,里面记录了修改过的字节码与源代码的映射关系。
6`;H%N;[%~'o051Testing软件测试网5A,v)N@u\Q7v
ot 6、要查看代码覆盖率时,执行下面的命令(andriod SDK里以及自带了emma.jar),下面命令里的sp参数即指定了 源代码的位置:51Testing软件测试网.y,yf*Z2|^cH]
51Testing软件测试网Z:^6xbX Fn3] java -cp ~/android-sdk/tools/lib/emma.jar emma report -r html -in coverage.em -in coverage.ec -sp ~/<andriod-app>/src/
\3|f#e/\bu S~051Testing软件测试网'V*yb(O:`C 这里我们把ant命令分解(假设已经将andriod eclipse工程转换成ant工程了),实际上执行下面几个命令就可以了,下例中~/research/multiplatformdemoproject就是andriod的主工程路径:51Testing软件测试网(S n2MP)V0~q`
51Testing软件测试网
o)a~;@5?^,|:U0N2i e7A-r,U cd ~/research/multiplatformdemoproject/
ty"a G5r2f0 # 编译成调试版
`OF\#AL(A0 ant debug51Testing软件测试网lR/u
G"w7b4Lno
3C
FNqmS0 # 在打包成dex文件之前,修改class字节码
!q0X1Vh^ i4n-|051Testing软件测试网u.\h6yXnq8aWB cd bin
:p)K*l%q8_%c;Gn1{)_0 java -cp ~/android-sdk/tools/lib/emma.jar emma instr -ip classes -d instrumented
rqcd#AG0 # 将修改成覆盖率统计版的class字节码打包成andriod虚拟机文件
B&^'cfFO1p0 ~/android-sdk/platform-tools/dx --dex --debug --no-optimize --output=classes.dex instrumented51Testing软件测试网#qkT$lQ
S
Q
~/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/51Testing软件测试网?_bcj$d
51Testing软件测试网R*Qz%kA9lR # 签名51Testing软件测试网ow
H]0Ifu-{zg
jarsigner -keystore ~/.android/debug.keystore -storepass
android -keypass android -signedjar multiplatformdemoproject.signed.apk
multiplatformdemoproject.unsigned.apk androiddebugkey51Testing软件测试网l~:^|4Df
~/android-sdk/tools/zipalign 4 multiplatformdemoproject.signed.apk multiplatformdemoproject.apk
R+wf6Lm#h?qu7bu#y0!z#P9a,{&@ YZ0 # 部署主程序到设备上
U:V_;_7k0 ~/android-sdk/platform-tools/adb install multiplatformdemoproject.apk51Testing软件测试网
d^2uq L Z(V$D{]
51Testing软件测试网"Z ?N)O&?)w%e # 编译测试用例51Testing软件测试网m3GRy%[2`!Q
cd tests51Testing软件测试网5Lqv^.H _&J E
E&_
ant debug51Testing软件测试网$k)?4A|Du
oH
51Testing软件测试网bB/a-c9i # 部署并且执行测试用例
A[5g
^ST Q*qB{0 ~/android-sdk/platform-tools/adb install multiplatformdemoproject.test-debug.apk
]7V!z8MtED4Qi0
~/android-sdk/platform-tools/adb shell am instrument -w -e coverage
true cc.iqa.studio.demo.test/android.test.InstrumentationTestRunner
1|lc'qk
h-P.nE051Testing软件测试网!a c \;dD&^ # 查看代码覆盖率结果报告
Q(f,AQ/WE:c-_0 cd http://www.cnblogs.com/bin/51Testing软件测试网rv.Dp5o+Y
~/android-sdk/platform-tools/adb pull /data/data/cc.iqa.studio.demo/files/coverage.ec .51Testing软件测试网u},HH8^R!e
java -cp ~/android-sdk/tools/lib/emma.jar emma report -r html -in
coverage.em -in coverage.ec -sp ~/research/multiplatformdemoproject/src/
\gq*Uat%n0g qrW2q,d0 下面是几个截图:
4RQ!\
mT[051Testing软件测试网u)lKy|
51Testing软件测试网*j4Wg!T@
本文出自:http://www.cnblogs.com/vowei/archive/2012/07/30/2614816.html。51Testing软件测试网Or(a)x e+w`S*U
D