2

我一直在尝试为我的 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 提供路径。

4

3 回答 3

2

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

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

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

在主项目中:android 更新项目 -p。在测试项目中: android update test-project -m "Path of main project" -p 。

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

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

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

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

在主项目中:ant emma debug install 在测试项目中:ant emma debug install test

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

于 2012-12-05T10:51:48.967 回答
2

很长一段时间以来,我也在做同样的事情。请参阅库项目的代码覆盖率报告

外部 jar 覆盖支持在 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>

我还没有运气。

于 2012-11-20T10:03:24.690 回答
0

我为此苦苦挣扎了 2 天,最终弄明白了。第一篇文章中的代码片段仅从 emma 元数据文件和运行时覆盖文件生成仪器报告,但不对 jar 执行仪器。要检测代码,您将不得不操作字节码,就像 android ant build.xml 目标是如何做到的。看一下嵌套在 <-compile> 中的元素,您会看到评论,就像它只是检测类文件一样。为了检测罐子,向罐子中添加一个类路径之类的元素以及类的路径。

艾玛文档: 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>
于 2014-01-24T06:27:01.707 回答