2009-03-17 6 views
1

Mon entreprise est en train de mettre à jour notre système de construction pour utiliser Buckminster (qui s'est bien passé). Naturellement, les gestionnaires aimeraient que nous puissions générer automatiquement certaines des mesures qu'ils utilisent pour le code pendant que nous y sommes - l'une de ces mesures est la couverture pour les tests unitaires. La version précédente, basée sur PDE, a généré une application sans interface séparée qui analyse tous les plugins dans le contexte, recherche en interne les classes de test, lance 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 propres à des métadonnées particulières (marques de copyright, etc.) et des tests de dépendance aux paquets.Comment faire en sorte que Cobertura/Emma joue bien avec une application Eclipse?

Il me semble que je devrais pouvoir exporter le produit pour l'application de test, l'instrument 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'ensemble du chemin de classe auquel ils ont affaire. Est-il possible de rendre l'un ou l'autre de ces outils sympa sans traquer tout mon espace de construction pour les jars et les dépendances?

Répondre

2

Géré pour que tout fonctionne, à l'aide d'une ancienne question SO.

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

Certains Google forensics nous a conduit à this book excerpt, qui couvre plutôt adéquatement la hiérarchie du chargeur de classe OSGi. En ajoutant la ligne osgi.parentClassloader=app à la config.ini de l'application en cours de test, nous pouvons spécifier un chemin de classe sur la ligne de commande. Ce classpath devait inclure:

  • Eclipse de startup.jar
  • Les pots Java SDK utilisés par l'application
  • Les pots pour l'outil de couverture

Bien sûr, nous courions les essais via Ant <java jar="foo.jar"> tâche, qui ignore silencieusement les informations de chemin de classe que vous fournissez et utilise uniquement le fichier jar. Après nous avons eu Emma travail, nous sommes passés à Cobertura, et notre dernier script Ant (légèrement abrégée et anonymisées) 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> 

Espérons que cela aide quelqu'un qui est au même endroit que nous étions dans

+0

fantastique ! Nous sommes en train de faire quelque chose de similaire en ce moment. Super trouvaille. –

Questions connexes