Domanda

Ho alcuni test unitario (anche se sono test Android, sto usando Robolectric, quindi stanno funzionando sul JVM).Corrono felicemente senza copertura.

Sto ricevendo questo errore da Emma-Maven quando lo provo con la copertura:

org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:emma-maven-plugin:1.0-alpha-3:instrument (default-cli) on project android: Execution default-cli of goal org.codehaus.mojo:emma-maven-plugin:1.0-alpha-3:instrument failed: class [com.larvalabs.svgandroid.ParserHelper] appears to be instrumented already
.

L'importante bit è class .... appears to be instrumented already.

È molto difficile trovare una documentazione corretta, ma questo è quello che ho acciottoti insieme per la configurazione da varie fonti:

<plugin>
    <!-- This doesn't work, see below for a working configuration -->
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>emma-maven-plugin</artifactId>
    <version>1.0-alpha-3</version>
    <inherited>true</inherited>                          
    <executions>
            <execution>
                    <phase>process-classes</phase>                               
                    <configuration>
                            <filters>
                                    <filter>-com.viewpagerindicator.*</filter>
                                    <filter>-com.actionbarsherlock.*</filter>
                                    <filter>-com.larvalabs.svgandroid.*</filter>
                            </filters>
                    </configuration>
                    <goals> 
                            <goal>instrument</goal>
                    </goals>
            </execution>
    </executions>
</plugin>
.

Il problema è che avendo escluso quei pacchetti che si stava lamentarti (pensavo che il problema sia che questi siano i progetti della biblioteca Android che finiscono inavvertitamente due volte su qualche elenco di percorsi), ora si lamenta dei miei pacchetti. .

Un collega ha suggerito in modo errato la sezione sopra dovrebbe andare in .

Si scopre che dovrebbe essere direttamente in e le estremime Bit devono essere rimosse, vedere la risposta.

È stato utile?

Soluzione

Ho trovato una soluzione - imbarazzantemente semplice.

Dimentica la roba del pluginmanagement: che solo "ha lavorato" facendolo ignorare i filtri per / questo / Pom, ma applicarli a qualsiasi Poms figlio: http://maven.apache.org/pom.html#plugin_Management

Basta spostare l'elemento di configurazione fuori dal blocco di esecuzioni e rimuovere il blocco di esecuzioni. http://maven.apache.org/Guides/mini/guide -Configuring-plugins.html # generico_configurazione

Con la sezione di configurazione immediatamente all'interno dell'elemento plugin, in esecuzione con 'MVN -X EMMA: EMMA' ha mostrato i filtri elencati. Poiché ogni riga di esclusione ha cambiato l'errore che ho visto, io deduco è stato escluso. (Raccolgo che per includere, aggiungi filtri con + prefissi per sovrascrivere sezioni di precedenti - prefissi.)

<project>
 <build>
  <plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>emma-maven-plugin</artifactId>
    <version>1.0-alpha-3</version>
    <!-- inherited>true</inherited -->
    <configuration>
            <filters>
                    <filter>-com.viewpagerindicator.*</filter>
                    <filter>-com.actionbarsherlock.*</filter>
                    <filter>-com.larvalabs.svgandroid.*</filter>
            </filters>
            <!-- verbose>true</verbose -->
   </configuration>
  </plugin>
.

Per quanto riguarda la parte implicita Android della domanda (che effettivamente rende il filtraggio abbastanza attenuato per me), poiché Android ha bisogno di un APK separato per contenere i test ed esercitare l'APK dell'applicazione principale, semplicemente non esegui Android Test di integrazione dello stesso progetto: il plugin Android vuole che tu faccia l'APK di test di integrazione da un progetto separato - in genere un fratello sotto lo stesso file POM genitore. Ci sono progetti di esempio / campione in una zip che si nasconde sulla pagina del plugin Android - http : //code.google.com/p/maven-android-plugin/wiki/samples - Entro il quale dovresti cercare la 'copertura' e cambiarlo su:

<coverage>true</coverage>
.

alla configurazione - un paio dei campioni ce l'ha commentata. Sono stato distratto, quindi non riesco a ricordare se funzionava, ma è chiaramente supposto.

Dal momento che non volevamo inserire un livello di directory nel controllo sorgente esistente del nostro progetto, abbiamo creato directory chiamate "genitore" e "integrazione" come peer del Pom.xml dell'applicazione, utilizzando "genitore" per contenere il POM genitore e 'integrazione' per i test di integrazione, con questa sezione per raccontare app / pom.xml di utilizzare app / genitore / pom.xml:

<project>
    <parent>
            <groupId>our.group.id</groupId>
            <artifactId>base</artifactId>
            <relativePath>parent</relativePath>
            <version>3.9.0</version>
    </parent>
.

E questo in app / integration / pom.xml:

<project>
  <parent>
    <groupId>our.group.id</groupId>
    <artifactId>base</artifactId>
    <relativePath>../parent</relativePath>
    <version>3.9.0</version>
  </parent>
.

Altri suggerimenti

Per quanto ho capito, le classi strumentate sono necessarie solo da Cobertura per la generazione del report. Se li crei in Target / Classes, sovrascriveranno i file di classe originali.

Se sono necessarie i file strumentati in un barattolo come risultato, è possibile configurare il Maven-Jar-Plugin per ritirare I file dalla directory target / Generated-Classes anziché o in aggiunta ai file dallo standard $ {build.project.outputDirectory}.

Modifica

Dai un'occhiata alla descrizione di Maven-Jar-Plugin. Per utilizzare solo lezioni target / generate, la seguente aggiunta al tuo POM dovrebbe funzionare - provalo e modificarlo alle tue esigenze:

<project>
  ...
  <build>
    <plugins>
      ...
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-jar-plugin</artifactId>
        <version>2.3</version> <!-- replace with correct version nbr! -->
        <configuration>
          <includes>
            <include>${project.build.directory}/generated-classes/**/*.class</include>
          </includes>
          <excludes>
            <exclude>${project.build.directory}/classes/**/*.class</include>
          </excludes>

        </configuration>
      </plugin>
      ...
    </plugins>
  </build>
  ...
</project>
.

${project.build.directory} punta alla cartella di destinazione, ${project.build.ouputDirectory} per target / lezioni. Non so se puoi semplicemente impostare ${project.build.ouputDirectory} in un nuovo valore - Dai un'occhiata a Questo capitolo del libro di Maven , forse trovi alcuni suggerimenti

Riferisci:

Alternativamente o inoltre è possibile utilizzare MAVEN per copiare i file da classi target / generate a Target / Classes dopo che coberture:instrument ha finito. Questa domanda ha una risposta con un esempio POM (frammento), devi solo identificare la fase corretta (le risorse di processo sono sicuramente troppo presto per il tuo caso)

E anche Riferisci questo

Spero che aiuti.!

Utilizzare la modalità="sovrascrittura".Funzionerebbe bene.

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