2016-10-26 3 views
0

J'essaie de tester une application EAR (app.ear) grosse grosse héritée en utilisant Arquillian et TestNG. Pour lancer le test, j'ai ajouté le fichier war testable (test.war) à l'app.ear existant et déployé sur le serveur WildFly 10 à distance."IllegalStateException: données d'exécution incompatibles pour la classe dans ..." exception de Jacoco lorsqu'il est exécuté pour une oreille existante

@Deployment 
public static EnterpriseArchive createDeployment(){ 
    return ShrinkWrap.createFromZipFile(EnterpriseArchive.class, new File("../earapp/target/earapp-0.0.1-SNAPSHOT.ear")) 
      .addAsModule(Testable.archiveToTest(ShrinkWrap.create(WebArchive.class, "test.war") 
        .addClass(CurrencyConverterTest.class) 
        .addAsWebInfResource(EmptyAsset.INSTANCE, "beans.xml"))); 
} 

La prochaine partie de mon exigence est d'obtenir un rapport de couverture de code après l'exécution des tests. Pour cela j'utilise Jacoco et je l'utilise avec Jacoco Maven Plugin.

<plugin> 
    <groupId>org.jacoco</groupId> 
    <artifactId>jacoco-maven-plugin</artifactId> 
    <version>0.7.7.201606060606</version> 
    <executions> 
     <execution> 
      <id>default-prepare-agent</id> 
      <goals> 
       <goal>prepare-agent</goal> 
      </goals> 
     </execution> 
     <execution> 
      <id>default-report</id> 
      <goals> 
       <goal>report</goal> 
      </goals> 
     </execution> 
</plugin> 

Le app.ear obtient déployé et les même les essais sont en cours d'exécution, mais bien quand il vient pour générer le rapport du Jacoco est défaillant par exception et « IllegalStateException: données d'exécution incompatibles pour la classe en Jacoco ...... ... "

L'exception provient uniquement de la classe qui contient les cas de test. Si j'exclue cette classe (CurrencyConverterTest.class) en utilisant la balise d'exclusion dans Jacoco Maven Plugin, l'exception disparaît mais les rapports générés par Jacoco ne contiennent aucune donnée. Aussi j'ai vérifié jacoco.exec et autant que je peux dire qu'il contient des données valides.

Comme je ne peux pas partager le code propriétaire avec lequel je travaille, j'ai créé trois projets simples sur github pour émuler la même chose.

  • Projet 1 (currencycoverter): Ce projet a un ejb sans état avec une interface distante ayant trois méthodes.
  • Projet 2 (earapp): Ce projet crée le fichier ear en utilisant le projet 1 en tant que module ejb.
  • Projet 3 (eartest): Ce projet tester l'oreille généré par le projet 2.

Pour moi, il ressemble qu'il ya un bug dans le code Jacoco mais je peux me tromper aussi. Sil te plait aide moi.

Mise à jour:étapes pour construire les projets partagés sur git

Étape 1: Découvrez tous les trois projets et importer dans Eclipse en tant que projets d'éclipse.

Etape 2: Lancer commande maven instll propre pour le projet 1 (ConvertisseurDevises)

Etape 3: exécution de la commande maven paquet propre pour le projet 2 (earapp). Cela créera un fichier ear dans le répertoire cible.

Étape 4: Démarrez un WildFly 10 en mode autonome sur la machine locale.

Étape 5: Exécutez la commande maven clean installez pour le projet 3 (eartest). Cela utilisera l'oreille générée à l'étape 3 et la déploiera dans le serveur d'applications WildFly 10 et exécutera les tests.

+0

Puisque Stackoverflow ne me permet pas d'ajouter plus de deux liens dans la question, le lien vers le projet 1 est https://github.com/keeshaaw/currencyconverter –

Répondre

1

Malheureusement, votre exemple ne peut pas être construit:

[ERROR] Failed to execute goal on project eartest: 
Could not resolve dependencies for project com.sg.eartest:eartest:jar:0.0.1-SNAPSHOT: 
Could not find artifact org.jboss.osgi.metadata:jbosgi-metadata:jar:3.0.1.Final in central (https://repo.maven.apache.org/maven2) 

il sera également plus simple à jouer avec elle, si elle serait située dans un référentiel unique GitHub.

Cependant:

Assurez-vous que vous utilisez exactement la même version de JaCoCo dans tous les modules en cours de test.

Et assurez-vous que la JVM sous test est terminée correctement, sinon vous risquez de recevoir le fichier "jacoco.exec" corrompu, car par défaut, il est sauvegardé lors de l'arrêt de la JVM. Dans les versions antérieures de ces JaCoCo fichiers corrompus peuvent provoquer une

IllegalStateException: Incompatible execution data for class... 

(selon https://github.com/jacoco/jacoco/issues/95#issuecomment-17271597)

Le message d'erreur en cas de fichiers tronqués a été amélioré dans la version 0.7.7 JaCoCo - https://github.com/jacoco/jacoco/pull/397 Et il est un bon pratique d'utiliser les dernières versions publiées car ils apportent des corrections de bugs et des améliorations - http://www.eclemma.org/jacoco/trunk/doc/changes.html

Enfin - semble que vos tests se trouvent complètement dans un module distinct du code principal sous test. "report" mojo crée un rapport pour les classes du module en cours. Utilisez "report-aggregate" pour agréger la couverture entre les modules - sa documentation peut être trouvée à http://www.eclemma.org/jacoco/trunk/doc/report-aggregate-mojo.html Quelques exemples ont été mentionnés dans https://groups.google.com/forum/#!msg/jacoco/8zjkSseaxD4/QOux-Ws-AgAJ

+0

Salut Godin, j'ai déjà des projets existants qui ont la même structure donc j'ai essayé d'émuler la même chose et par conséquent les tests sont dans un projet différent du projet qui contient la source de l'application. J'ai nettoyé le pom du projet eartest et j'ai également vérifié les fichiers .project et .classpath d'eclipse dans le repo git. Maintenant, si vous suivez les étapes (question mise à jour), vous devriez être capable de construire les projets et de les tester. –

+0

@KeshawKumar Je ne vais pas le tester - voir la dernière partie de ma réponse: utilisez "report-aggregate" au lieu de "report" lorsque les tests sont situés dans un module séparé. – Godin

+0

Oui, à partir de la dernière partie de votre réponse, il est très clair où je me trompe. Merci pour votre aide. J'apprécie vraiment cela. :-) –

-1

J'ai posé cette question au groupe d'utilisateurs Jacoco et ils m'ont demandé de mettre à jour la version de Jacoco à la dernière.J'utilisais Jacoco 0.7.4.201502262128 et je recevais cette exception. Maintenant, j'ai déménagé à Jacoco 0.7.7.201606060606 et le problème est résolu. De plus, le groupe d'utilisateurs Jacoco m'a demandé d'utiliser la même version de l'agent Jacoco Jacoco et du plugin Jacoco Maven pour éviter tout problème à l'avenir.

+0

Désolé, mais je ne vois pas dans https://groups.google.com/d/msg/jacoco/Y7x6e0ECLI0/GVktU1kXAQAJ que j'ai dit qu'il y avait un bogue plus tôt versions. – Godin

+0

@Godin Désolé, j'ai fait une supposition car il n'y avait pas d'autre moyen d'expliquer pourquoi l'exception est parti après seulement la mise à niveau de Jacoco à la version actuelle. J'ai supprimé la partie de la réponse qui dit qu'il y avait un bug. Désolé encore pour hypothèse sans confirmation de votre part. –