2009-03-17 6 views
1

Meine Firma ist gerade dabei, unser Build-System auf Buckminster umzustellen (was gut gelaufen ist). Natürlich würden die Manager es gerne sehen, wenn wir automatisch einige der Metriken generieren könnten, die sie für den Code verwenden, während wir gerade dabei sind - eine dieser Metriken ist die Abdeckung für die Komponententests. Der vorherige Build, der auf PDE basiert, führte zu einer separaten Anwendung ohne Kopf, die alle Plugins im Kontext durchsucht, in ihnen nach Testklassen sucht, alle Testfälle in eine größere Suite wirft und dann programmgesteuert ausführt , über JUnitResultFormatter.startTestSuite(). In diesem Prozess werden einige selbst erstellte Tests für bestimmte Metadaten (Copyright-Markierungen usw.) hinzugefügt und Tests auf Paketabhängigkeit durchgeführt.Wie kann ich Cobertura/Emma mit einer Eclipse-Anwendung spielen?

Es scheint, als ob ich in der Lage sein würde, das Produkt für die Test-App einfach zu exportieren, es mit dem Coverage-Tool meiner Wahl zu instrumentieren und es dann auszuführen; Es sieht jedoch so aus, als ob beide Coverage-Tools den gesamten Klassenpfad kennen, mit dem sie arbeiten. Ist es möglich, eines dieser Tools zum Kinderspiel zu machen, ohne meinen gesamten Build-Arbeitsbereich nach Jars und Abhängigkeiten zu durchsuchen?

Antwort

2

Verwaltet, um alles mit Hilfe einer älteren SO-Frage zum Laufen zu bringen.

Wir begannen mit this post, die uns mit einem Beispiel Abdeckung Setup mit EMMA zur Verfügung gestellt. Es sah jedoch so aus, als müssten wir bei jedem Plugin, für das wir Coverage-Daten erhalten wollten, eine Abhängigkeit von EMMA erzwingen.

Einige Google-Forensik haben uns zu this book excerpt, die die OSGi-Classloader-Hierarchie ausreichend abdeckt. Durch Hinzufügen der Zeile osgi.parentClassloader=app zur Datei config.ini der Anwendung zum Ausführen von Tests könnten wir einen Klassenpfad auf der Befehlszeile angeben. Das Classpath benötigt enthalten:

  • Eclipse startup.jar
  • das Java SDK Gläser von der Anwendung verwendet
  • Die Gläser für die Coverage Tool

Natürlich waren wir die Tests über die <java jar="foo.jar"> Ant läuft task, die automatisch alle von Ihnen bereitgestellten Klassenpfadinformationen ignoriert und nur jar verwendet. Nachdem wir hatten Emma arbeiten, wechselten wir zu Cobertura, und unser letzter Ant-Skript (leicht gekürzt und anonymisierten) sieht so aus:.

<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> 

Hoffentlich jemand hilft, wer an der gleichen Stelle ist, in der wir waren

+0

Fantastische ! Wir tun gerade etwas ähnliches. Toller Fund. –