我希望在运行单元测试时获得代码覆盖率。
我使用标准的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]
除了最后一步,一切似乎对我都有好处。
答案 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报告零覆盖,正如所讨论的那样。