2013-04-19 15 views
5

Staramy się generować raporty pokrycia dla naszej aplikacji GWT z zestawu testów jednostkowych napisanych przy użyciu programu gwt-test-utils. Projekt jest projektem wielomodułowym. Używamy sonaru-wtyczki na jenkins w celu generowania i zestawiania informacji o zasięgu i naruszeniach.Urządzenie gwt-test-utils nie działa po uruchomieniu z jacoco

Kiedy zadania build uruchomić wszystkie testy jednostkowe GWT przekazać jako część normalnej produkcji, jednak gdy plugin Sonar próbuje ponownie uruchomić testy wszystkie one niepowodzeniem z powodu następującego błędu:

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

pominie pozostałe dane wyjściowe konsoli z Jenkins i katalogi obszaru roboczego, nie mogę zlokalizować pliku dziennika, do którego odnosi się "com.google.gwt.core.ext.UnableToCompleteException: (zobacz poprzednie wpisy dziennika)".

Czy ktoś napotkał podobny problem i wie, jak uruchomić program Sonar, aby uruchomić program narzędziowy gwt-test-utils, lub przynajmniej będzie miał pomysł, kiedy wyszukać poprzednie wpisy dziennika wymienione w tym wyjątku.

EDYCJA: Po dalszych eksperymentach wydaje się, że problem jest spowodowany przez jacoco. próbuje uruchomić tylko testy jednostkowe oprzyrządowanego z jacoco (i bez zaangażowanego sonar) prowadzi do tego samego błędu


** EDIT:

próbka z 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

Po debugowania odkryłem, że problem jest z maven + jacoco. Jeśli uruchomisz jacoco z eclipse (wtyczka ecl emma) - zobaczysz raport zasięgu kodu. –

+0

Potrzebujemy, aby zadanie było uruchamiane jako część pracy polegającej na budowaniu nocnej dżinsów, która używa sonaru do raportowania wynikowych statystyk zasięgu. Każdy pomysł, w jaki sposób możemy wygenerować zasięg, a następnie ponownie użyć go w maven/sonar w tym ustawieniu? Aplikacja jest wbudowana w netbeans, z powodu problemów, które mieliśmy z org.apache.osgi framework w eclipse. – user2075499

Odpowiedz

3

Jak wspomniałem w komentarzach, biblioteki ładowane są w innej kolejności dla jacoco z maven-surefire-plugin. Aby rozwiązać ten problem, napisz swojego własnego biegacza (rozszerzenie com.googlecode.gwt.test.GwtRunner) i zmień moduł ładowania klas dla kontekstClientLoader wątku.

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()]); 
     } 

    } 

w badaniach przesłonić GwtRunner przez MyGwtRunner

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

Nadal pojawia się ten sam problem w zadaniu sonaru z tą konfiguracją. Postaram się jednak, aby jacoco obejmował początkowe przebiegi testowe i ustawienie sonaru do ponownego wykorzystania raportów. Zostanie skomentowana, gdy już spróbuję. – user2075499

+0

Wypróbowałem to za pomocą ustawienia pom, które dodałem do powyższego pytania, i nadal widzę ten sam błąd. Musiałem użyć dodatkowego parametru argline, aby uzyskać jacoco, aby spróbować wygenerować pokrycie dla testów jednostkowych gwt-test-utils. – user2075499

+0

Testowałem to tylko z jenkins. Buduj koniec z sukcesem, ale brakuje raportu ... sprawdzę, dlaczego. –

Powiązane problemy