我正在做一个由.NET代码和android java项目组成的项目。我们正在努力让这两种类型的项目在一个TeamCity环境中工作。
.NET项目正在通过一些NUnit项目进行测试,我们使用DotCoverr来生成覆盖率报告,一切似乎都很好。现在,android/java项目是使用ant runner构建的,我们有一些用于生产和测试项目的构建脚本,问题似乎是创建java覆盖率报告。
我们创建了一个包含以下蚂蚁目标的构建步骤:
clean emma debug install test
构建步骤设置为启用"Emma coverage runner"(选中选项"Include source files in The coverage data")。
运行生成步骤时发生错误,在日志片段中声明以下内容(已附加完整的日志文件)。另一个重要问题是android/java单元测试没有出现在构建的总体统计数据中。
这是日志剪辑:
[16:37:52]: [aapt] Generating resource IDs...
[16:37:55]: [subant] -pre-compile
[16:37:55]: [subant] -compile (1s)
[16:37:55]: [-compile] do-only-if-manifest-hasCode (1s)
[16:37:55]: [do-only-if-manifest-hasCode] sequential (1s)
[16:37:55]: [sequential] if (1s)
[16:37:55]: [if] Adding debug=true parameter to javac task
[16:37:55]: [if] javac
[16:37:55]: [if] Compiling 1 source file to C:BuildAgentworkc588ac2d935670cbMyAndroidProjectbinclasses
[16:37:55]: [if] EMMA: Instrumenting classes
[16:37:55]: [EMMA: Instrumenting classes] EMMA commandline: [-ix, -*Test*, -cp, C:BuildAgentworkc588ac2d935670cbMyAndroidProjectbinclasses, -m, overwrite]
[16:37:55]: [EMMA: Instrumenting classes] EMMA: processing instrumentation path ...
[16:37:56]: [EMMA: Instrumenting classes] EMMA: instrumentation path processed in 265 ms
[16:37:56]: [EMMA: Instrumenting classes] EMMA: [167 class(es) instrumented, 0 resource(s) copied]
[16:37:56]: [EMMA: Instrumenting classes] EMMA: metadata merged into [C:BuildAgentworkc588ac2d935670cbcoverage.em] {in 15 ms}
[16:37:56]: [if] if
[16:37:56]: [if] echo
[16:37:56]: [echo] Instrumenting classes from C:BuildAgentworkc588ac2d935670cbMyAndroidProjectbin/classes...
[16:37:56]: [if] emma
[16:37:56]: [emma] com.vladium.emma.EMMARuntimeException: [OUT_IO_FAILURE] exception occurred while writing output file [C:BuildAgentworkc588ac2d935670cbcoverage.em]:
[16:37:56]: [do-only-if-manifest-hasCode] The following error occurred while executing this line: C:Androidandroid-sdktoolsantbuild.xml:655: com.vladium.emma.EMMARuntimeException: [OUT_IO_FAILURE] exception occurred while writing output file [C:BuildAgentworkc588ac2d935670cbcoverage.em]:
[16:37:56]: [subant] The following error occurred while executing this line: C:Androidandroid-sdktoolsantbuild.xml:602: The following error occurred while executing this line: C:Androidandroid-sdktoolsantbuild.xml:655: com.vladium.emma.EMMARuntimeException: [OUT_IO_FAILURE] exception occurred while writing output file [C:BuildAgentworkc588ac2d935670cbcoverage.em]:
[16:37:56]: [Step 1/18] EMMA: Create Report (4s)
[16:38:00]: [EMMA: Create Report] Unable to find C:BuildAgentworkc588ac2d935670cbcoverage.ec, cannot create EMMA report
[16:38:00]: [Step 1/18] Process exited with code 1
[16:38:00]: [Step 1/18] Ant output:
[16:38:00]: [Step 1/18] at java.lang.reflect.Method.invoke(Method.java:601)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.Task.perform(Task.java:348)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68)
[16:38:00]: [Step 1/18] at com.android.ant.IfElseTask.execute(IfElseTask.java:120)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291)
[16:38:00]: [Step 1/18] at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source)
[16:38:00]: [Step 1/18] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[16:38:00]: [Step 1/18] at java.lang.reflect.Method.invoke(Method.java:601)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.Task.perform(Task.java:348)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.Target.execute(Target.java:390)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.Target.performTasks(Target.java:411)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1399)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.Project.executeTarget(Project.java:1368)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.helper.DefaultExecutor.executeTargets(DefaultExecutor.java:41)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.Project.executeTargets(Project.java:1251)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.Main.runBuild(Main.java:809)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.Main.startAnt(Main.java:217)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.launch.Launcher.run(Launcher.java:280)
[16:38:00]: [Step 1/18] at org.apache.tools.ant.launch.Launcher.main(Launcher.java:109)
[16:38:00]: [Step 1/18] Caused by: java.io.IOException: cannot merge new data into [C:BuildAgentworkc588ac2d935670cbcoverage.em]: created by another EMMA version [0.0.0]
[16:38:00]: [Step 1/18] at com.vladium.emma.data.DataFactory.persist(DataFactory.java:593)
[16:38:00]: [Step 1/18] at com.vladium.emma.data.DataFactory.persist(DataFactory.java:71)
[16:38:00]: [Step 1/18] at com.vladium.emma.instr.InstrProcessorST._run(InstrProcessorST.java:753)
[16:38:00]: [Step 1/18] ... 71 more
[16:38:00]: [Step 1/18] Total time: 6 seconds
[16:38:00]: [Step 1/18] Publishing artifacts
[16:38:00]: [Publishing artifacts] Paths to publish: [C:BuildAgentworkc588ac2d935670cbcoverage.ec, C:BuildAgentworkc588ac2d935670cbcoverage.em, C:BuildAgentworkc588ac2d935670cbcoverage.txt, C:BuildAgentworkc588ac2d935670cbcoveragecoverage.zip]
[16:38:00]: [Publishing artifacts] Artifacts path coverage.ec not found
[16:38:00]: [Publishing artifacts] Artifacts path coverage.txt not found
[16:38:00]: [Publishing artifacts] Artifacts path coverage/coverage.zip not found
[16:38:00]: [Publishing artifacts] Sending files
[16:38:00]: [Step 1/18] Failed to extract Emma coverage statistics from the coverage.txt, due to error: java.io.FileNotFoundException: C:BuildAgentworkc588ac2d935670cbcoverage.txt (The system cannot find the file specified)
[16:38:00]: [Step 1/18] Step Test Smart Client - Unit tests (Ant) failed
有人知道问题出在哪里吗?
顺便说一句,当我直接从命令行运行目标时,报告的构建没有任何问题。
谨致问候,根据
Android SDK使用的EMMA版本比Sonar EMMA插件使用的版本旧。
代码覆盖率的编码方式似乎在不同版本之间发生了变化,这就是Sonar无法识别格式的原因。
幸运的是,有人想出了一个代码转换器。此处对该问题进行了更详细的描述:http://jira.codehaus.org/browse/SONARPLUGINS-1356
上述代码转换器的java代码也可以从那里下载。
在运行Sonar之前,你只需要对所有.em和.ec文件进行转码,它应该会仔细阅读并测试它们。