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