艾玛报道0%的报道

时间:2011-06-03 06:06:31

标签: android ant code-coverage emma

我希望在运行单元测试时获得代码覆盖率。 我使用标准的android build.xml运行ant coverage进行测试。

测试运行良好。来自ant coverage的最后一个字符串是

Tests run: 59,  Failures: 1,  Errors: 4

Generated code coverage data to /data/data/my.package/files/coverage.ec

但是coverage.ec文件只有37个字节长,几乎是空的。

运行emma报告告诉

no collected coverage data found in any of the data files [all reports will be empty]

并在每个领域生成精美的ZEROES报告。

我认为艾玛应该产生更大的覆盖率.c。

我做错了什么?

---更新---

做了一些深挖。除了覆盖结果生成之外,似乎大多数情况都很好。

1)它汇编了所有说法

[javac] /blabla/android-sdk-linux_x86/tools/ant/main_rules.xml:384: warning: 'includeantruntime' was not set, defaulting to build.sysclasspath=last; set to false for repeatable builds
[javac] Compiling 88 source files to /blabla/project/tests/instrumented/classes
[javac] Note: Some input files use unchecked or unsafe operations.
[javac] Note: Recompile with -Xlint:unchecked for details.

2)对于正在测试的项目,<instr>正在mode="overwrite"。路径没问题。

-emma仪器:      [echo]从/ blabla / project / tests / instrumented / classes ...

中检测类

因此,有一个* .em文件,其中包含98个类的元数据。

3)一些标准的android转换为dex,包为unaligned,zip align。结果是/blabla/project/tests/instrumented/project-debug.apk。

4)将此项目-debug.apk安装到模拟器上。

5)编译测试项目。     编译:     [javac] /blabla/android-sdk/android-sdk-linux_x86/tools/ant/main_rules.xml:384:警告:'includeantruntime'未设置,默认为build.sysclasspath = last;对于可重复的构建,设置为false     [javac]将110个源文件编译为/ blabla / project / tests / bin / classes

源文件包括所有以前的文件和测试(110 = 88 +测试),如build.properties中所述(多个source.dir用“;”分隔)。

6)资源,Dex,签名,zip对齐...结果是projectTest-debug.apk

7)将projectTest-debug.apk安装到模拟器上。

8)通过am运行测试,其中指定了“coverage on”。它告诉

[exec] Generated code coverage data to /data/data/blabla.project/files/coverage.ec

9)此coverage.ec不包含相关数据。它长37个字节。关于它的报告告诉我们

processing input file [/home/ubuntu/projects/ppf2/workspace/PPF2/tests/coverage.ec] ...
loaded 0 coverage data entries
...
no collected coverage data found in any of the data files [all reports will be empty]

除了最后一步,一切似乎对我都有好处。

2 个答案:

答案 0 :(得分:3)

我遇到了同样的问题,我想我明白这里发生了什么。

我看起来测试包的来源也在测试包的内部(或被引用为源)。

结果是,如果opened them up

,您的包apks看起来如下所示
PackageUnderTest/ClassFileUnderTest

TestPackage/TestClass
TestPackage/ClassFileUnderTest

ClassFileUnderTest:

pluclic class ClassFileUnderTest{
    public int foo(){
       ...
    }
}

识别TestClass:

pluclic class TestClass{
    public void testFoo(){
       int result = foo();
       assert...
    }
}

这里发生的事情是,只要你的TestClass从testFoo()调用foo()方法,就会在TestClass / ClassFileUnderTest而不是PackageUnderTest / ClassFileUnderTest上调用foo()。

因此,已编程的PackageUnderTest / ClassFileUnderTest从未运行,并且未在覆盖率报告中记录。

从TestPackage中删除引用PackageUnderTest代码,强制PackageUnderTest代码从PackageUnderTest运行并计入覆盖率报告。

答案 1 :(得分:0)

最后,经过数小时的战斗,问题解决了。 分辨率非常简单且不可思议。

在TEST项目的build.properties中,我有类似的东西:

tested.project.dir=..
env.WORKSPACE= /bla/bla
source.dir=${env.WORKSPACE}/first/src;${env.WORKSPACE}/second/src;${env.WORKSPACE}/andsoon/src;

但是!我不应该在这里指定source.dir!指定tested.project.dir足以成功编译测试项目。

此外,如果我像这样在TEST项目中指定source.dir - 测试运行良好,但emma报告零覆盖,正如所讨论的那样。

相关问题