Android in Hudson (5) 加入JUnit & Emma 分析

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需要做下列修改:

  1. 將android-junit-report-<version>.jar 加到test project的lib資料夾中(若無lib就建立)
  2. 將build path加入lib資料夾
  3. 修改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 />前