Question

Mon entreprise est en train de mettre à niveau notre système de construction pour utiliser Buckminster (ce qui s'est bien passé).Naturellement, les managers aimeraient que nous puissions générer automatiquement certaines des métriques qu'ils utilisent pour le code pendant que nous y sommes - l'une de ces métriques est la couverture des tests unitaires.

La version précédente, qui était basée sur PDE, aboutissait à une application sans tête distincte qui analyse tous les plugins dans le contexte, recherche à l'intérieur les classes de test, jette tous les cas de test dans une suite plus grande, puis l'exécute par programme, via JUnitResultFormatter.startTestSuite().Dans le processus, il ajoute des tests internes pour des métadonnées particulières (marquages ​​de droits d'auteur, etc.) et des tests de dépendance aux packages.

Il semble que je devrais pouvoir simplement exporter le produit pour l'application de test, l'instrumenter avec l'outil de couverture de mon choix, puis l'exécuter ;cependant, il semble que les deux outils de couverture souhaitent connaître l'intégralité du chemin de classe qu'ils traitent.Est-il possible de faire en sorte que l'un ou l'autre de ces outils fonctionne correctement sans parcourir tout mon espace de travail de construction à la recherche de fichiers jar et de dépendances ?

Était-ce utile?

La solution

J'ai réussi à tout faire fonctionner, avec l'aide d'une ancienne question SO.

Nous avons commencé avec ce post, qui nous a fourni un exemple de configuration de couverture utilisant EMMA.Cependant, il est apparu que nous devions imposer une dépendance à EMMA sur chaque plugin pour lequel nous souhaitions obtenir des données de couverture.

Certaines analyses de Google nous ont amenés à cet extrait de livre, qui couvre assez adéquatement la hiérarchie des chargeurs de classes OSGi.En ajoutant le osgi.parentClassloader=app ligne au config.ini de l'application de test en cours d'exécution, nous pourrions spécifier un chemin de classe sur la ligne de commande.Ce chemin de classe devait inclure :

  • Éclipse startup.jar
  • Les fichiers jar du SDK Java utilisés par l'application
  • Les pots pour l'outil de couverture

Bien sûr, nous effectuions les tests via le <java jar="foo.jar"> Tâche Ant, qui ignore silencieusement toutes les informations de chemin de classe que vous fournissez et utilise uniquement le fichier jar.Après avoir fait travailler Emma, ​​nous sommes passés à Cobertura, et notre script Ant final (légèrement abrégé et anonymisé) ressemble à :

<target name="generate.coverage" depends="buckminster.init">
  <!-- Generate the classpath. -->
  <path id="cobertura.classpath">
    <fileset dir="${tasks.dir}/lib/cobertura">
      <include name="cobertura.jar" />
      <include name="**/*.jar" />
    </fileset>
  </path>
  <taskdef classpathref="cobertura.classpath" resource="tasks.properties" />

  <!-- Get ready to run the unit tests app, and delete old coverage data. -->
  <unzip src="${test-app.artifact}" dest="${output.dir}" overwrite="true" />
  <delete file="${output.dir}/cobertura.ser" />

  <!-- Instrument the jars in-place. Make sure to only capture what you want instrumented! -->
  <cobertura-instrument datafile="${output.dir}/cobertura.ser">
    <fileset dir="${output.dir}/test-app/plugins">
      <include name="**/*our.company_*.jar" />
    </fileset>
  </cobertura-instrument>

  <!-- Run the unit test application, by classname rather than by jar. -->
  <java fork="true" classname="org.eclipse.equinox.launcher.Main" logerror="true" failonerror="true" maxmemory="1G">
    <classpath>
      <pathelement location="${output.dir}/test-app/startup.jar" />
      <pathelement location="${tasks.dir}/lib/cobertura/cobertura.jar" />
      <fileset dir="${tasks.dir}/lib/cobertura">
        <include name="**/*.jar" />
      </fileset>
      <pathelement location="${java.class.path}" />
    </classpath>
    <sysproperty key="net.sourceforge.cobertura.datafile" file="${output.dir}/cobertura.ser" />            
    <arg value="-data" />
    <arg value="${output.dir}/test-app/workspace" />
    <arg value="--formatter=org.apache.tools.ant.taskdefs.optional.junit.XMLJUnitResultFormatter:${log.dir}/test-results.xml" />
  </java>

  <!-- Generate the coverage reports. -->
  <cobertura-report format="html" datafile="${output.dir}/cobertura.ser" destdir="${output.dir}/cobertura-report">
    <fileset dir="${workspace.dir}/plugins">
      <include name="**/*.java" />
    </fileset>
  </cobertura-report>
</target>

J'espère que cela aidera quelqu'un qui se trouve au même endroit que nous.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top