EMMA是一個Java代碼測試覆蓋率獲取工具。嘗試了一種使用EMMA獲取Android測試覆蓋率的方法,參考使用了
DynoDroid提供的方法,其原理是使用插樁與BroadcastReceiver
,使得插樁後打包簽名而成的APK運行時每次操做均發送信息給BroadcastReceiver
,BroadcastReceiver
中負責將覆蓋率信息寫到SD卡的名爲coverage.ec
的文件中。其一大優勢爲全程無需修改原APK的源碼。html
假定APK所在包爲net.clasnake.project
,工程主目錄爲/folder
。java
首先下載EmmaInstrument.rar,解壓後包含四個文件:android
EmmaInsrumentation.java
FinishListener.java
InstrumentedActivity.java
SMSInstrumentedReceiver.java
將文件夾EmmaInstrument複製到/folder/src下。
將上述四個java文件的包名修改成net.clasnake.project.EmmaInstrument
,並令InstrumentedActivity
繼承自項目的主Activity。
而後修改AndroidManifest.xml
,加入SMSInstrumentedReceiver
、EmmaInstrumentationActivity
:git
<receiver android:name="net.clasnake.project.EmmaInstrument.SMSInstrumentedReceiver"> <intent-filter> <action android:name="edu.gatech.m3.emma.COLLECT_COVERAGE"/> </intent-filter> </receiver> <activity android:label="EmmaInstrumentationActivity" android:name="net.clasnake.project.EmmaInstrument.InstrumentedActivity"/>
加入插樁標籤,並容許寫SD卡權限:github
<instrumentation android:handleProfiling="true" android:label="EmmaInstrumentation" android:name="net.clasnake.project.EmmaInstrument.EmmaInstrumentation" android:targetPackage="net.clasnake.project"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
鏈接設備至adb,首先android update project
更新項目,生成build.xml,以便使用ant。shell
而後編譯插樁版本:ant instrument
。工具
安裝:ant installi
。post
啓動插樁版本:adb shell am instrument net.clasnake.project/net.clasnake.project.EmmaInstrument.EmmaInstrumentation
測試
進行測試,結束後使用後退鍵退出應用。ui
從設備中獲得coverage.ec:adb pull /mnt/sdcard/coverage.ec
從/folder/bin中獲得coverage.em,該文件中包含了待測APP的結構信息,將其與coverage.ec放置同一目錄下,而後生成覆蓋率報告:
java -cp ~/adt/sdk/tools/lib/emma.jar emma report -r html -in coverage.em,coverage.ec
。
在同目錄下的coverage文件夾下生成覆蓋率報告: