Domanda

La mia azienda è nel mezzo dell'aggiornamento del nostro sistema di build per utilizzare Buckminster (che è andato bene). Naturalmente i gestori vorrebbero che potessimo generare automaticamente alcune delle metriche che usano per il codice mentre ci siamo - una di queste metriche è la copertura per i test unitari.

La build precedente, basata su PDE, ha portato a un'applicazione headless separata che analizza tutti i plug-in nel contesto, cerca al loro interno le classi di test, lancia tutti i casi di test in una suite più ampia e quindi lo esegue in modo programmatico, tramite JUnitResultFormatter.startTestSuite(). Nel processo aggiunge alcuni test fatti in casa per particolari metadati (marchi di copyright, ecc.) E test per la dipendenza del pacchetto.

Sembra che dovrei essere in grado di esportare il prodotto per l'app di test, strumentarlo con lo strumento di copertura di mia scelta e quindi eseguirlo; tuttavia, sembra che entrambi gli strumenti di copertura vogliano conoscere l'intero percorso di classe con cui hanno a che fare. È possibile rendere piacevole uno di questi strumenti senza trascinare l'intero spazio di lavoro di build per barattoli e dipendenze?

È stato utile?

Soluzione

Gestito per far funzionare tutto, con l'aiuto di una vecchia domanda SO.

Abbiamo iniziato con questo post , che ci ha fornito un esempio di configurazione della copertura tramite EMMA. Tuttavia, sembrava che avremmo dovuto imporre una dipendenza dall'EMMA su ogni plug-in per il quale volevamo ottenere dati sulla copertura.

Alcuni studi forensi di Google ci hanno portato a questo estratto del libro , che copre piuttosto adeguatamente la gerarchia del classloader OSGi. Aggiungendo la riga osgi.parentClassloader=app a config.ini dell'applicazione in esecuzione test, potremmo specificare un percorso di classe sulla riga di comando. Quel percorso di classe doveva includere:

  • Eclipse startup.jar
  • I vasetti Java SDK utilizzati dall'applicazione
  • I vasetti per lo strumento di copertura

Naturalmente, stavamo eseguendo i test tramite l'attività <java jar="foo.jar"> Ant, che ignora silenziosamente tutte le informazioni sul percorso di classe fornite e utilizza solo il vaso. Dopo che Emma ha lavorato, siamo passati a Cobertura e la nostra sceneggiatura finale di Ant (leggermente abbreviata e anonimizzata) assomiglia a:

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

Speriamo che questo aiuti qualcuno che si trova nello stesso posto in cui ci trovavamo.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top