使用jacoco运行Gwt-test-utils单元时失败



我们正在尝试从使用GWT -test-utils编写的一组单元测试中为GWT应用程序生成覆盖率报告。该项目是一个多模块maven项目。我们正在jenkins上使用声纳插件,以便生成和整理我们的覆盖范围和违规信息。

当构建作业运行时,所有GWT单元测试都作为正常构建的一部分通过,但是当Sonar插件试图重新运行测试时,它们都失败了,并出现以下错误:

initializationError(uk.co.card.gwt.retailpost.client.dialog.productmodify.CurrencyEditDialogTest)运行时间:0秒<<<错误!gwttestexception:生成gwt-test-utils先决条件时出错在com.googlecode.gwt.test.internal.GwtFactory。(GwtFactory.java:>

查看jenkins控制台输出的其余部分,以及工作空间目录,我找不到"com.google.gwt.core.ext. exe"所包含的日志文件。UnableToCompleteException:(见之前的日志条目)"指的是。

是否有人遇到过类似的问题,并且知道如何让Sonar成功运行gwt-test-utils,或者至少知道何时查找异常中提到的先前日志条目。

编辑:经过进一步的实验,这个问题似乎是由jacoco引起的。尝试只运行jacoco仪器的单元测试(不涉及声纳)会导致相同的错误


* *编辑:

from pom.xml

    <build>
pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.jacoco</groupId>
                    <artifactId>jacoco-maven-plugin</artifactId>
                    <version>0.6.2.201302030002</version>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.12.4</version>
                    <configuration>                        
                        <excludedGroups combine.self="override" />
                        <reuseForks>true</reuseForks>
                        <argLine>-Xmx1024m -XX:MaxPermSize=256m ${jacoco.agent.argLine}</argLine>
                    </configuration>
                </plugin>
</plugins>
        </pluginManagement>
        <plugins>            
            <plugin>
                <groupId>org.jacoco</groupId>
                <artifactId>jacoco-maven-plugin</artifactId>
                <configuration>
                    <propertyName>jacoco.agent.argLine</propertyName>
                    <destFile>${sonar.jacoco.itReportPath}</destFile>
                    <append>true</append>
                    <excludes>
                        <exclude>*.osgi.*</exclude>
                        <exclude>*.apache.*</exclude>
                        <exclude>*.sourceforge.*</exclude>
                        <exclude>*.junit.*</exclude>
                        <!-- Test support code does not need to be covered -->
                        <exclude>uk.co.card.retailpost.clientintegration.utilities.*</exclude>
                    </excludes>
                    <classDumpDir>temp/classes</classDumpDir>
                </configuration>
                <executions>
                    <execution>
                        <id>agent</id>
                        <goals>
                            <goal>prepare-agent</goal>
                        </goals>
                    </execution>
                    <execution>
                        <id>report</id>
                        <goals>
                            <goal>report</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>   
        </plugins>
    </build>

正如我在评论中提到的,使用maven-surefire-plugin的jacoco以不同的顺序加载库。要解决这个问题,编写你自己的运行程序(extends com. googlcode .gwt.test. gwtrunner),并将classloader改为线程contextClassLoader。

import com.googlecode.gwt.test.GwtRunner;
    public class MyGwtRunner extends GwtRunner {
        static {
            URLClassLoader classLoader = (URLClassLoader) MyGwtRunner.class.getClassLoader();
            try {
                URL[] urls = getClassPath();
                ClassLoader cl = URLClassLoader.newInstance(urls, classLoader);
                Thread.currentThread().setContextClassLoader(cl);
            } catch (MalformedURLException e) {
                throw new IllegalStateException(e);
            }
        }
        public MyGwtRunner(Class<?> clazz) throws Throwable {
            super(clazz);
        }
        private static URL[] getClassPath() throws MalformedURLException {
            String classPath = System.getProperty("java.class.path");
            String pathSeparator = System.getProperty("path.separator");
            String[] array = classPath.split(pathSeparator);
            List<URL> files = new ArrayList<URL>();
            for (String a : array) {
                files.add(new File(a).toURI().toURL());
            }
            return files.toArray(new URL[files.size()]);
        }
    }

在你的测试中用MyGwtRunner

覆盖GwtRunner
@GwtModule("com.my.module.GwtTestUtils")
@RunWith(MyGwtRunner.class)
public abstract class AbstractGwtJunit extends GwtTest { 
....
}

相关内容

  • 没有找到相关文章

最新更新