Frage

Meine Firma ist in der Mitte unserer Build-System ein Upgrade Buckminster zu verwenden (was gut gegangen ist). Natürlich sind die Manager es gerne hätte, wenn wir automatisch einige der Metriken erzeugen könnten sie für Code verwenden, während wir gerade dabei sind -. Eine dieser Metrik ist Abdeckung für die Unit-Tests

Die vorherigen Build, das war PDE-basierte, führten zu einer separaten kopflosen Anwendung, die im Rahmen durch alle Plugins analysiert, sieht in sie für Testklassen, wirft alle Testfälle in eine größere Suite und es läuft dann programmatisch, über JUnitResultFormatter.startTestSuite(). Im Prozess fügt es einige homegrown Tests für bestimmte Metadaten (Copyright Markierungen, etc.) und Tests für Paketabhängigkeit.

Es scheint, wie soll ich in der Lage sein, nur das Produkt für den Test-App zu exportieren, Instrument mit dem Coverage Tool meiner Wahl, und dann laufen; aber es sieht aus wie sowohl die Abdeckung Werkzeuge, um den gesamten Classpath wissen wollen, mit denen sie sich zu tun. Ist es möglich, schön spielt entweder diese Werkzeuge zu machen, ohne meinen gesamten Build-Arbeitsbereiches für Gläser zu Schleppen und Abhängigkeiten?

War es hilfreich?

Lösung

Managed bekommen alles funktioniert, mit Hilfe einer älteren SO Frage.

Wir begannen mit diesem Beitrag , die uns mit einem Beispiel Abdeckung Setup mit EMMA zur Verfügung gestellt. Allerdings schien es, dass wir eine Abhängigkeit von EMMA auf jeder Plugin zwingen müssen, würden wir Berichterstattung Daten bekommen wollten.

Einige Forensik Google hat uns href="http://www.informit.com/content/images/0321268385/samplechapter/arthorne_ch05.pdf" rel="nofollow noreferrer"> diesem Buchauszug osgi.parentClassloader=app Linie zum config.ini der Test laufenden Anwendung, könnten wir eine Classpath auf der Kommandozeile angeben. Das Classpath benötigt enthalten:

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

Natürlich liefen wir die Tests über die <java jar="foo.jar"> Ant-Task, die lautlos jede Classpath Informationen nicht ignoriert die Sie und verwendet nur das Glas. Nachdem wir hatten Emma arbeiten, wechselten wir zu Cobertura, und unser letzter Ant-Skript (leicht gekürzt und anonymisiert) wie folgt aussieht:

<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 hilft das jemandem, der an der gleichen Stelle ist, die wir waren in.

scroll top