2013-04-19 6 views
5

Wir versuchen, aus einer Reihe von Komponententests, die mit gwt-test-utils geschrieben wurden, Deckungsberichte für unsere GWT-Anwendung zu erstellen. Das Projekt ist ein Multi-Modul Maven-Projekt. Wir verwenden das Sonar-Plugin auf Jenkins, um unsere Coverage- und Verletzungsinformationen zu generieren und zu sammeln.gwt-test-utils-Einheit schlägt fehl, wenn jacoco ausgeführt wird

Wenn die Baujobs all GWT Unit-Tests als Teil des normalen Build passieren laufen, aber wenn die Sonar-Plugin der Tests erneut auszuführen versucht sie alle mit dem folgenden Fehler fehlschlagen:

initializationError(uk.co.card.gwt.retailpost.client.dialog.productmodify.CurrencyEditDialogTest) Time elapsed: 0 sec <<< ERROR! com.googlecode.gwt.test.exceptions.GwtTestException: Error while generating gwt-test-utils prerequisites at com.googlecode.gwt.test.internal.GwtFactory.(GwtFactory.java:113) at com.googlecode.gwt.test.internal.GwtFactory.initializeIfNeeded(GwtFactory.java:45) at com.googlecode.gwt.test.internal.junit.AbstractGwtRunner.(AbstractGwtRunner.java:30) at com.googlecode.gwt.test.GwtRunner.(GwtRunner.java:19) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at org.junit.internal.builders.AnnotatedBuilder.buildRunner(AnnotatedBuilder.java:29) at org.junit.internal.builders.AnnotatedBuilder.runnerForClass(AnnotatedBuilder.java:21) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:26) at org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:250) at org.apache.maven.surefire.junit4.JUnit4Provider.executeTestSet(JUnit4Provider.java:141) at org.apache.maven.surefire.junit4.JUnit4Provider.invoke(JUnit4Provider.java:112) 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 org.apache.maven.surefire.util.ReflectionUtils.invokeMethodWithArray(ReflectionUtils.java:189) at org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) at org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) at org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) at org.apache.maven.surefire.booter.ForkedBooter.main(ForkedBooter.java:75) Caused by: com.google.gwt.core.ext.UnableToCompleteException: (see previous log entries) at com.google.gwt.dev.cfg.ModuleDef.checkForSeedTypes(ModuleDef.java:559) at com.google.gwt.dev.cfg.ModuleDef.getCompilationState(ModuleDef.java:363) at com.google.gwt.dev.cfg.ModuleDef.getCompilationState(ModuleDef.java:354) at com.googlecode.gwt.test.internal.GwtFactory.createCompilationState(GwtFactory.java:151) at com.googlecode.gwt.test.internal.GwtFactory.(GwtFactory.java:106) ... 25 more

durch die Suche Rest der Konsole Ausgabe von Jenkins, und die Workspace-Verzeichnisse, kann ich nicht finden Sie die Protokolldatei, die die "com.google.gwt.core.ext.UnableToCompleteException: (siehe vorherige Protokolleinträge)" bezieht sich auf.

Hat jemand ein ähnliches Problem festgestellt und weiß, wie man Sonar dazu bringt, die gwt-test-utils erfolgreich auszuführen, oder zumindest eine Idee haben wird, nach den in der Ausnahme erwähnten vorherigen Protokolleinträgen zu suchen.

EDIT: Nach weiteren Experimenten scheint das Problem von Jacoco verursacht worden zu sein. nur die Unit-Tests instrumentiert mit jacoco (und ohne Sonar beteiligt) ergibt sich der gleiche Fehler versucht zu laufen


** EDIT:

Probe von 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> 
+0

Nach dem Debuggen ich entdecken, ist GwtRunner von MyGwtRunner außer Kraft setzen, dass Problem mit Maven + jacoco. Wenn Sie jacoco von eclipse (ecl emma plugin) ausführen, sehen Sie einen Code Coverage Report. –

+0

Wir müssen den Job als Teil eines nächtlichen jenkins-Build-Jobs ausführen, der Sonar verwendet, um die sich daraus ergebenden Coverage-Statistiken zu melden. Irgendeine Idee, wie wir die Abdeckung erzeugen könnten, und sie dann in Maven/Sonar in dieser Einrichtung wiederverwenden? Die Anwendung ist in Netbeans gebaut, aufgrund von Problemen mit dem Org.apache.osgi-Framework in Eclipse. – user2075499

Antwort

3

Wie ich in den Kommentaren erwähnt habe, werden die Bibliotheken für jacoco mit maven-surefire-plugin in unterschiedlicher Reihenfolge geladen. Um dieses Problem zu lösen, schreiben Sie Ihren eigenen Runner (erweitert com.googlecode.gwt.test.GwtRunner) und ändern Sie den Klassenlader für den Thread 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()]); 
     } 

    } 

In Ihren Tests

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

Immer noch das gleiche Problem im Sonar-Job mit dieser Konfiguration. Ich werde jedoch versuchen, jacoco dazu zu bringen, die ersten Testläufe abzudecken und Sonar zu setzen, um die Berichte wiederzuverwenden. Ich werde kommentieren, sobald ich das versucht habe. – user2075499

+0

Ich habe es mit der Pom-Einstellung versucht, die ich der obigen Frage hinzugefügt habe, und ich sehe immer noch den gleichen Fehler. Ich musste den zusätzlichen argline-Parameter verwenden, um jacoco zu versuchen, Abdeckung für die gwt-test-utils Unit-Tests zu generieren. – user2075499

+0

Ich habe es nur mit jenkins getestet. Build Ende mit Erfolg, aber Bericht fehlt ... Ich werde prüfen, warum. –