4

我正在使用calabash-android测试我的 android 应用程序,它提供了它自己的“测试项目”,并使用一个脚本重命名它的包以反映被测应用程序,然后使用 InstrumentationTestRunner 子类:

adb shell am instrument -w -e class sh.calaba.instrumentationbackend.InstrumentationBackend #{ENV['TEST_PACKAGE_NAME']}/sh.calaba.instrumentationbackend.CalabashInstrumentationTestRunner

我将接受任何允许我为 Android 应用程序生成类似于 Emma 或 Cobertura 的代码覆盖率报告的答案,并在 calabash-android 中进行测试时收集数据。

为了让艾玛工作,我...

  • 尝试按照这些说明让 Maven 构建我的项目(因为我使用 ant 已经太久了)。生成一个coverage.em文件target/emma
  • 修改calabash-android脚本,增加“ -e coverage true
  • 当我运行 calabash-android 时,我最终看到“生成的覆盖数据到 /data/data/my.project/files/coverage.ec”
  • adb -e pull /data/data/my.project/files/coverage.ec coverage.ec

...所以现在我应该能够运行:

  • java -cp $ANDROID_HOME/tools/lib/emma.jar emma report -r html -in target/emma/coverage.em,coverage.ec

我收到一个错误:

EMMA: processing input files...
java.io.UTFDataFormatException: malformed input around byte 107

...所以我认为android maven 插件有问题,我试图弄清楚如何生成coverage.em文件。我跑了“ android update project -p .”和“ ant emma”和“ ant emma debug”,但我在任何地方都找不到coverage.em ...

...生成的 build.xml 文件似乎暗示只有在您运行“ant emma test”时才会生成coverage.em 文件,但我认为这不会起作用,因为测试应用程序由葫芦-机器人。

为了让 Cobertura 工作,我有...

  • 谷歌搜索了各种形式的“cobertura android”,但似乎没有人有任何运气。
  • 尝试在我的 Maven pom 文件中配置 cobertura 配置文件来检测类,但是(在 Maven 3 中)我得到了
    • 一大堆关于 log4j 和 ant 具有“InnerClasses”属性的警告,我应该从源代码重新编译它们
    • com.jayway.maven.plugins.android.generation2:android-maven-plugin:3.3.0:dex "ANDROID-040-001: 无法执行的错误:Command = /bin/sh -c -cd /path/ to/myproject && java -jar $ANDOID_HOME/platform-tools/lib/dx.jar --dex ..."

EXCEPTION FROM SIMULATION:
local variable type mismatch: attempt to set or access a value of type 
java.lang.Class using a local variable of type java.lang.reflect.Type[].  
This is symptomatic of .class transformation tools that ignore local variable information.

...这可能就是为什么没有人能够让 cobertura 在 Android 上运行?

4

1 回答 1

5

问题是maven-android-plugin使用 emma 的 2.1.5320 版本,而 Android 工具使用 2.0.5312 版本。正如这里所讨论的,这两个版本是不兼容的。

解决方法是在这两个工具中只使用一个版本。我已经能够通过克隆maven-android-plugin存储库、将 emma 依赖版本设置回 2.0.5312 并将其安装到我的本地存储库来使其工作。确保您的被测项目中的 emma 依赖项也是正确的,然后您应该能够生成覆盖率。

另一种方法是确保所有工具都使用最新版本。我还没有测试过,但是如果你从 maven 生成报告,它可能会起作用,因为版本会是一样的。您还可以下载最新版本的 emma 并使用该软件包中的 jar 生成报告。

于 2012-08-24T09:26:37.333 回答