声纳和雅各布:怎么样? (与Cobertura的兼容性)

时间:2012-05-29 07:59:23

标签: maven selenium jenkins sonarqube jacoco

我知道有很多关于Sonar和Jacoco没有在SO上正确生成报告的问题,但没有一个能帮我解决问题:

这是合约:

我有一个项目使用Cobertura来计算代码覆盖率,我无法改变它。声纳必须使用Cobertura作为服务器端。但另一方面,我有这个客户端(我们在谈论使用java中的smartGWT的web应用程序),它使用Selenium RC进行测试(因为这是测试smartGWT的唯一方法)。

Cobertura无法计算Selenium测试的覆盖率,因为这些测试是在已部署的应用程序上完成的。 Jacoco可以计算出来,因为它是作为java代理启动的。所以一切都在我的电脑上正常工作。 jacoco.exec生成成功。但似乎Sonar无法找到如何阅读该文件,或者可能只是cobertura和jacoco有冲突......

这是Jenkins生成的错误:

[INFO] Surefire report directory: D:\JENKINS-SONAR\jobs\agepro PROTO\workspace\target\surefire-reports
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at sun.instrument.InstrumentationImpl.loadClassAndStartAgent(InstrumentationImpl.java:323)
    at sun.instrument.InstrumentationImpl.loadClassAndCallPremain(InstrumentationImpl.java:338)
Caused by: java.io.FileNotFoundException: D:\JENKINS-SONAR\jobs\agepro (Accès refusé)
    at java.io.FileOutputStream.openAppend(Native Method)
    at java.io.FileOutputStream.<init>(FileOutputStream.java:177)
    at org.jacoco.agent.rt_9w37ty.controller.LocalController.startup(LocalController.java:46)
    at org.jacoco.agent.rt_9w37ty.JacocoAgent.init(JacocoAgent.java:83)
    at org.jacoco.agent.rt_9w37ty.JacocoAgent.premain(JacocoAgent.java:165)
    ... 6 more
FATAL ERROR in native method: processing of -javaagent failed
Exception in thread "main" 

这是我对surefire插件的配置:

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <configuration>
                    <argLine>-javaagent:${sonar.jacoco.jar}=destfile=${sonar.jacoco.reportPath}</argLine>
                    <excludes>
                        <exclude>**/Selenium*.java</exclude>
                    </excludes>
                </configuration>
                <executions>
                    <execution>
                        <id>surefire-integration-test</id>
                        <phase>integration-test</phase>
                        <goals>
                            <goal>test</goal>
                        </goals>
                        <configuration>
                            <!-- <argLine>-javaagent:${sonar.jacoco.jar}=destfile=${sonar.jacoco.reportPath}</argLine> -->
                            <excludes>
                                <exclude>none</exclude>
                            </excludes>
                            <includes>
                                <include>**/Selenium*.java</include>
                            </includes>
                            <goal>selenium-test</goal>
                        </configuration>
                    </execution>
                </executions>
            </plugin>

你看到我能犯的任何错误吗?或者也许我必须为jacoco jar或其他东西设置另一条路径?无论如何,谢谢你的帮助。

1 个答案:

答案 0 :(得分:1)

名称reportPath有点误导。

设置sonar.jacoco.reportPath需要指向文件,而不是指向目录。

您似乎已将其设置为:D:\JENKINS-SONAR\jobs\agepro:但我认为您的意思是D:\JENKINS-SONAR\jobs\agepro\jacoco.exec

在进一步检查时,我注意到问题可能是您工作目录“agepro PROTO”中有空格。

这打破了java代理配置的语法。你能摆脱这个空间(我不知道destfile='${sonar.jacoco.reportPath}'是否可行)