Je fais un test d'intégration à l'aide de Arquillian dans la télécommande TomEE-Plus 7.0.4 et j'essaie d'obtenir une couverture de code à l'aide de Jacoco 0.8.2 . Ma couverture de code n'est pas couverte car j'utilise arquillian-tomee-remote. Puisque le code n'est pas couvert, il n'est pas possible de prendre build. J'ai besoin d'un exemple de code avec une télécommande TomEE-plus arquillian et une couverture de code à l'aide de Jacoco. J'apprécierai si j'obtiens un exemple de code de travail ou un exemple de projet.
J'ai utilisé le but de prepare-agent qui générera surefireArgLine (javaagent) et je le passai dans le plugin surefire. problème ici est, j'utilise Tomee distant et je ne sais pas comment générer un agent Java correct surefireArgLine défini sur - javaagent: /home/user/.m2/repository/org/jacoco/org.jacoco.agent/0.8 .2 / org.jacoco.agent-0.8.2-runtime.jar = destfile = / home / user / project / target / coverage-reports / jacoco-ut.exec, append = true, excludes = / config /*.class:/util/*Constants.class
Plug-in Jacoco
<extension qualifier="jacoco"> <property name="includes">com.demo.*</property> </extension>
Dépendance
<dependency> <groupId>org.jboss.arquillian.testng</groupId> <artifactId>arquillian-testng-container</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.config</groupId> <artifactId>arquillian-config-api</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.jboss.arquillian.extension</groupId> <artifactId>arquillian-jacoco</artifactId> <version>1.0.0.Alpha10</version> <scope>test</scope> </dependency> <dependency> <groupId>org.jacoco</groupId> <artifactId>org.jacoco.agent</artifactId> <classifier>runtime</classifier> <scope>test</scope> <version>${plugin.maven.jacoco.version}</version> </dependency> <!-- https://mvnrepository.com/artifact/org.jacoco/org.jacoco.core --> <dependency> <groupId>org.jacoco</groupId> <artifactId>org.jacoco.core</artifactId> <version>${plugin.maven.jacoco.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.tomee</groupId> <artifactId>arquillian-tomee-remote</artifactId> <version>${tomee.version}</version> <scope>test</scope> </dependency>
3 Réponses :
Clause de non-responsabilité: je ne suis expert ni en Arquillian ni en TomEE, vous pouvez donc adapter la réponse à vos besoins.
Quoi qu'il en soit, en un mot, le bytecode des instruments JaCoCo afin de fournir un rapport de couverture.
Depuis quand Arquillian est utilisé, l'exécution réelle du test se produit dans une JVM TomEE et non dans une JVM qui exécute réellement la suite de tests (probablement un serveur CI ou juste un script de construction qui exécute le test), donc configurer JaCoCo sur ce la machine de test ne fera pas grand-chose, vous devrez configurer le serveur lui-même.
JaCoCo a une option -javaagent
pour ce faire, et cet agent Java "interceptera" le chargement des classes par le serveur et les instrumentera.
Maintenant, quand JaCoCo fonctionne, il produit un fichier jacoco.exec
qui contient en fait un rapport de couverture qui peut être affiché plus tard de différentes manières (plugin jenkins pour montrer la couverture, intégration du sondeur quoi que ce soit).
Et c'est de loin l'option AFAIK la plus utilisée, donc si vous optez pour cette approche, étant donné que l'instrumentation fonctionne vraiment, une fois les tests terminés, vous devrez trouver le serveur sur la machine de test et le télécharger sur la machine de construction. et intégrez avec CI / Sonar quoi que ce soit.
Cependant, il existe des solutions alternatives:
La documentation JaCoCo indique qu'il existe trois modes d'exécution d'un instrumentation de l'agent Java:
Techniquement, vous pouvez simplement donner des paramètres différents à cet agent Java pour qu'il exécute JaCoCo dans l'un de ces modes.
Quoi qu'il en soit, nous avons discuté de la première option, mais vous pouvez également travailler avec des configurations TCP si nécessaire. Bien sûr, ici, vous devrez gérer les problèmes de sécurité (comme l'autorisation d'exposer / d'accéder au port, etc.).
Si vous travaillez en mode TCP, il existe un Plugin Maven qui peut venir à portée de main. Je ne l'ai pas utilisé par moi-même, j'ai juste cherché sur Google, donc je ne peux pas dire si c'est bon, il n'a que 2 étoiles sur Github, donc probablement ce n'est pas prêt pour la production, mais peut-être que vous pourriez avoir des idées à partir de son code source. p>
Je comprends que les tests sont exécutés dans un conteneur tomee distant. J'ai besoin de savoir comment configurer javaagent pour mon scénario
Comme je n'ai pas travaillé avec TomEE, je ne pourrai probablement pas en avoir beaucoup.Dans un cas de Tomcat, je pense que vous devriez ajouter la définition javaagent à la variable JAVA_OPTS (voir ses scripts de démarrage) et bien sûr choisir le mode de invocation jacoco (l'un de ces trois). Espérons que nos collègues fourniront une réponse plus précise.
Je sais, ma réponse n'a pas changé à ce sujet, elle vient d'être éditée par Godin (formatage, dénomination, etc.). Espérons que les personnes qui ont réellement traité avec TomEE et Jacoco peuvent fournir une solution précise avec des configurations réelles. Avez-vous essayé la modification JAVA_OPTS? Crée-t-il des fichiers jacoco.exec après l'exécution des tests (même sans modes TCP plus avancés)?
Ma configuration actuelle crée jacoco.exec. Mais il ne connecte pas le tomee distant, car je ne connais pas la configuration javaagent pour le tomee distant
Je voulais dire sur le serveur TomEE, avez-vous utilisé javaagent dans javaopts là-bas? Comment l'avez-vous configuré? Veuillez mettre à jour la question avec ces informations.
J'ai utilisé l'objectif de prepare-agent qui générera surefireArgLine (javaagent) et je l'ai passé dans le plugin surefire. Le problème ici est, j'utilise Tomee distant et je ne sais pas comment générer un agent Java correct surefireArgLine défini sur -javaagent: /home/user/.m2/repository/org/jacoco/org.jacoco.a gent / 0.8. 2 / org.jacoc o.agent-0.8.2-runtim e.jar = destfile = / home / utilisateur / projet / cible / coverage-reports / ja coco-ut.exec, append = true , exclut = ** / con fig / *. class: ** / util / * Constants.class
Je suis confus maintenant ... Je voulais dire en fait tomee script, pas du tout maven et pas un infaillible. Jacoco doit fonctionner sur le serveur tomee et non sur le jvm qui exécute les tests ... C'est là que les données de couverture ne sont pas générées
Je ne suis pas expert en télémaintenance. Si j'utilise arquillian-tomee-embedded, aucun changement de code. J'utilise arquillian-tomee-remote qui est démarré par arquillian localement, ne fonctionnant pas sur une machine distante. Étant donné que tomee-embedded ne prend en charge aucun classificateur tomee (plus, Microprofile), j'utilise tomee-remote. Je veux savoir comment configurer javaagent dans maven jacco ou dans surefire pluggin
J'ai ajouté l'agent Java approprié (surefireArgLine) au serveur distant TomEE via catalina opts in surefire pluggin. ça marche.
surefireArgLine - Sera rempli par l'agent de préparation Surefire au moment de l'exécution.
<tomee.catalina_opts> ${surefireArgLine}</tomee.catalina_opts>
Vous pouvez définir catalina_opts dans arquillian.xml pour le conteneur tomee. Filtrez-le avec maven pour passer jacoco javaagent et vous avez terminé :).
Oui vous avez raison. Je remplace toutes les propriétés arquilliennes dans maven surefire pluggin. Pourriez-vous s'il vous plaît répondre à mon autre question TomEE ( stackoverflow.com/questions/53996746/... ). Merci d'avance.
pourrait m'aider sur stackoverflow.com/questions/54412555/...