通过build.xml和ant.properties中的更改生成android代码覆盖

时间:2012-11-20 04:09:47

标签: android build code-coverage emma

我一直在尝试为我的android测试项目生成android代码覆盖率,该测试项目测试包含外部jar的android项目。当我运行命令

ant emma install debug test

它只显示了android项目的覆盖范围,但不包括所包含的外部jar的包和功能。 根据我的研究,我发现应该在ant.properties文件和emma report tag build.xml中进行一些更改。

欢迎任何建议。

[编辑]

在我的研究中,我浏览了一个博客,上面写着输入变量

tested.android.library.source.dir="path to external jars" in ant.properties

并且应在报告源路径中添加相同的变量

<emma>
                    <report sourcepath="${tested.project.source.absolute.dir}:${tested.project.lib.source.path.value}:${tested.android.library.source.dir}" verbosity="${verbosity}">
                        <!-- TODO: report.dir or something like should be introduced if necessary -->
                        <infileset file="${out.absolute.dir}/coverage.ec" />
                        <infileset file="${tested.project.out.absolute.dir}/coverage.em" />
                        <!-- TODO: reports in other, indicated by user formats -->
                        <html outfile="${out.absolute.dir}/coverage.html" />
                   </report>
  </emma>

但是覆盖范围仍未显示外部jar的功能和包。

我想知道我的jar不是在android测试项目中,而是在测试的android项目中。那么如何在测试项目的ant.properties中给出那些外部jar的路径。

3 个答案:

答案 0 :(得分:2)

我也在很长一段时间内从事同样的工作。 请参阅code coverage reports for library projects

外部罐子覆盖支持在ADT-r20中。 我只能指出我的工作方向。 我正在修改ant:

中的build.xml
 <!-- This is macro that enable passing variable list of external jar files to ApkBuilder
     Example of use:
     <package-helper>
         <extra-jars>
            <jarfolder path="my_jars" />
            <jarfile path="foo/bar.jar" />
            <jarfolder path="your_jars" />
         </extra-jars>
     </package-helper> -->
<macrodef name="package-helper">
    <element name="extra-jars" optional="yes" />
    <sequential>
        <apkbuilder
                outfolder="${out.absolute.dir}"
                resourcefile="${resource.package.file.name}"
                apkfilepath="${out.packaged.file}"
                debugpackaging="${build.is.packaging.debug}"
                debugsigning="${build.is.signing.debug}"
                verbose="${verbose}"
                hascode="${manifest.hasCode}"
                previousBuildType="${build.last.is.packaging.debug}/${build.last.is.signing.debug}"
                buildType="${build.is.packaging.debug}/${build.is.signing.debug}">
            <dex path="${intermediate.dex.file}"/>
            <sourcefolder path="${source.absolute.dir}"/>
            <jarfile refid="project.all.jars.path" />
            <nativefolder path="${native.libs.absolute.dir}" />
            <nativefolder refid="project.library.native.folder.path" />
            <extra-jars/>
        </apkbuilder>
    </sequential>
</macrodef>

我还没有运气。

答案 1 :(得分:2)

经过大量的搜索和尝试,终于在我的主项目中得到了我的外部jar包。 刚刚在ant.properties和build.xml中输入了tests.android.library.source.dir

  

ant.properties:tested.android.library.source.dir =“存在jar的主项目的libs文件夹的路径”   Build.xml:在报告标记中的emma标记下添加此变量,用冒号分隔。

现在转到命令提示符并运行

  

在主项目中:android更新项目-p。   在测试项目中:android update test-project -m“主项目路径”-p。

现在从build.xml复制测试目标(sdk / tools / ant / build.xml)并将其粘贴到行上方的测试项目的build.xml中

 <import file="${sdk.dir}/tools/ant/build.xml" />

不要忘记将版本标记更改为

现在再次打开命令提示符并运行:

  

在主项目中:ant emma debug install   在测试项目中:ant emma调试安装测试

生成的代码覆盖率报告将包含外部jar的包

答案 2 :(得分:0)

我为此奋斗了2天并最终弄明白了。第一篇文章中的代码片段仅从emma metadatafile和运行时覆盖文件生成工具报告,但不对jar执行检测。要检测代码,您必须操纵字节代码,就像android ant build.xml目标一样。看看嵌套在&lt; -compile&gt;中的元素并且您将看到评论,例如它只是检测类文件。为了对罐子进行检测,在罐子中添加类似于class的类路径以及类的路径。

Emma文档:http://emma.sourceforge.net/reference/ch02s03s02.html

<emma enabled="${emma.enabled}" >
  <instr mode="fullcopy"
         outdir="${out.instr.dir}"
         merge="no"
         filter="${emma.filter}">
    <instrpath>
      <fileset dir="${out.dir}" includes="**/*.jar" />
    </instrpath>
  </instr>
</emma>

在Android的build.xml中。只需删除instrpath属性并使其看起来像上面的例子。

 756                     <emma enabled="true">
 757                         <instr verbosity="${verbosity}"
 758                                mode="overwrite"
 759                                instrpath="${out.absolute.dir}/classes"
 760                                outdir="${out.absolute.dir}/classes"
 761                                metadatafile="${emma.coverage.absolute.file}">
 762                             <filter excludes="${emma.default.filter}" />
 763                             <filter value="${emma.filter}" />
 764                         </instr>
 765                     </emma>

这样的事情:(原谅#s行)

 756                     <emma enabled="true">
 757                         <instr verbosity="${verbosity}"
 758                                mode="overwrite"
 760                                outdir="${out.absolute.dir}/classes"
 761                                metadatafile="${emma.coverage.absolute.file}">
 759                                <instrpath>
 759                                     <pathelement path="${out.absolute.dir}/classes"/>
 759                                     <fileset dir="${you-class-path}"/>
 759                                          <include name="**/*.jar"/>
 759                                     </fileset>
 759                                </instrpath>
 762                             <filter excludes="${emma.default.filter}" />
 763                             <filter value="${emma.filter}" />
 764                         </instr>
 765                     </emma>