Android in Hudson (5) 加入JUnit & Emma 分析
如果前面你有研究過ant_test_rules_r3.xml的話,你其實已經發現到Emma的部分,它已經幫你做好,
理論上你如果執行了coverage的話,也就已經可以產生Emma的結果,但是.... 似乎JUnit的結果就沒有產生出來。
由於預設的InstrumentationTestRunner不會產生我們想要的JUnit Test結果,讓hudson的plugin產生圖表資料,
我在網路上找到有個佛心的人寫個JUnitReportTestRunner,繼承InstrumentationTestRunner而來,以Apache License v2.0授權,
因此可以安心使用,然而根據其官網的說明,test project需要做下列修改:
- 將android-junit-report-<version>.jar 加到test project的lib資料夾中(若無lib就建立)
- 將build path加入lib資料夾
- 修改test project的AndroidManifest.xml,找到tag "instrumentation" 把屬性"android:name" 換成 com.zutubi.android.junitreport.JUnitReportTestRunner
加上原本的coverage產生的Emma report是html,但我想要xml格式在加上還要處理JUnit結果的關係,
我新增了coverage-xml到test porject的build.xml 如下:
<target name="coverage-xml" depends="-set-coverage-classpath, -install-instrumented, install"
description="Runs the tests against the instrumented code and generates
code coverage report">
<run-tests-helper emma.enabled="true">
<extra-instrument-args>
<arg value="-e" />
<arg value="coverageFile" />
<arg value="${emma.dump.file}" />
</extra-instrument-args>
</run-tests-helper>
<echo>Downloading XML test report...</echo>
<exec executable="${adb}" failonerror="true">
<arg line="${adb.device.arg}"/>
<arg value="pull" />
<arg value="/data/data/${tested.manifest.package}/files/junit-report.xml" />
<arg value="junit-report.xml" />
</exec>
<echo>Downloading coverage file into project directory...</echo>
<exec executable="${adb}" failonerror="true">
<arg line="${adb.device.arg}" />
<arg value="pull" />
<arg value="${emma.dump.file}" />
<arg value="coverage.ec" />
</exec>
<echo>Extracting coverage report...</echo>
<emma>
<report sourcepath="${tested.project.absolute.dir}/${source.dir}"
verbosity="${verbosity}">
<!-- TODO: report.dir or something like should be introduced if necessary -->
<infileset dir=".">
<include name="coverage.ec" />
<include name="coverage.em" />
</infileset>
<!-- TODO: reports in other, indicated by user formats -->
<xml outfile="coverage.xml" />
</report>
</emma>
<echo>Cleaning up temporary files...</echo>
<delete dir="${instrumentation.absolute.dir}" />
<delete file="coverage.ec" />
<delete file="coverage.em" />
<echo>Saving the report file in ${basedir}/coverage/coverage.xml</echo>
</target>
這個coverage-xml基本上是我從ant_test_rules_r3.xml中的coverage抄出來的,我把增修的部分額外列出如下:
1.以下是JUnit結果從Android模擬器下載與儲存到Hudson的動作,我將它放在處理Emma結果前
<echo>Downloading XML test report...</echo>
<exec executable="${adb}" failonerror="true">
<arg line="${adb.device.arg}"/>
<arg value="pull" />
<arg value="/data/data/${tested.manifest.package}/files/junit-report.xml" />
<arg value="junit-report.xml" />
</exec>
2.以下是我把原本emma格式從html改成xml
<xml outfile="coverage.xml" />
最後還有一個要點是必須複寫property "test.runner" 因為他預設是android.test.InstrumentationTestRunner,可以將下面這個加在build.xml中
<property name="test.runner" value="com.zutubi.android.junitreport.JUnitReportTestRunner" />
完成以上設定後,執行ant coverage-xml 就可以得到unit test與code coverage的結果。
注意:target定義需在<setup />後,taskdef與property等需在<setup />前