2012-08-14 19 views
15

Quando si utilizza il plug-in maven-surefire ed entrambi include ed esclude, in quale ordine vengono elaborati? Inoltre, se hai 3 serie di test, il primo è il set base, il secondo e il terzo casi speciali, puoi usare i profili per includere/escludere ulteriormente? Come si unirà/escluderà le impostazioni del profilo? Ad esempio, mi piacerebbe fare qualcosa di simile:maven-surefire-plug-in include/exclude precedenza

<build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-surefire-plugin</artifactId> 
     <version>2.12.2</version> 
     <configuration> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 
     </plugin> 
    </plugins> 
    </build> 

    <profiles> 
    <profile> 
     <id>connectedToProdNetwork</id> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <includes> 
       <include>/org/mycompany/dataset/test/ExtractProd*.java</include> 
       </includes> 
      </configuration> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    <profile> 
     <id>runForAsLongAsYouNeed</id> 
     <build> 
     <plugins> 
      <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <includes> 
       <include>/org/mycompany/dataset/test/LargeDataset*.java</include> 
       </includes> 
      </configuration> 
      </plugin> 
     </plugins> 
     </build> 
    </profile> 
    </profiles> 

e quindi essere in grado di eseguire in questo modo:

mvn package -P connectedToProdNetwork 

o

mvn package -P runForAsLongAsYouNeed 

o

mvn package -P connectedToProdNetwork,runForAsLongAsYouNeed 

---- AGGIORNAMENTO -----

Utilizzando mvn help:effective-pom -P [profileA] sono stato in grado di determinare che se a specificare un singolo profilo, il pom efficace risultante sarà:

 <configuration> 
      <includes> 
      <include>[includeFromProfileA]</include> 
      </includes> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 

E se io fornisco più di un profilo, mvn help:effective-pom -P [profileA],[profileB]:

 <configuration> 
      <includes> 
      <include>[includeFromProfileAOrBSeeminglyArbitraryChoice]</include> 
      </includes> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 

Infine, se aggiungo l'attributo combine.children="append" all'elemento <includes> delle configurazioni del profilo e fornisco entrambi i profili, mvn help:effective-pom -P [profileA],[profileB]:

 <configuration> 
      <includes combine.children="append"> 
      <include>[includeFromProfileA]</include> 
      <include>[includeFromProfileB]</include> 
      </includes> 
      <excludes> 
      <exclude>/org/mycompany/dataset/test/ExtractProd*.java</exclude> <!-- requires special network connectivity --> 
      <exclude>/org/mycompany/dataset/test/LargeDataset*.java</exclude> <!-- requires lengthy processing --> 
      </excludes> 
     </configuration> 

Tuttavia, ora che ogni file è specificato sia come <include> ed un <exclude>, cosa succede?

---- ---- UPDATE 2

effettivamente in esecuzione una build con questa configurazione:

<configuration> 
    <includes> 
    <include>**/TestA.java</include> 
    </includes> 
    <excludes> 
    <exclude>**/TestA.java</exclude> 
    </excludes> 
</configuration> 

Does NON corsa Testa, in modo che appaia un <exclude> volontà overpower a <include>. Nota che per completezza, ho invertito l'ordine e ho inserito <excludes> prima del <includes> ma il comportamento non è cambiato. Se qualcuno può trovare qualche parte del codice sorgente in cui è descritto questo comportamento, sarei felice di dare loro la risposta ...

+3

L'esclusione include le sostituzioni perché in genere le persone includono un set più grande del necessario e hanno solo bisogno di essere prese. Questo generalmente rende una lista più breve e meno lavoro. – Steven

+0

@Steven, sì, corrisponde a quello che ho provato durante i test. Sai dovunque questo è dichiarato _ ufficialmente in modo che io sappia che non cambieranno questo comportamento in futuro? Comunque, grazie amico. – Lucas

+0

Penso che l'approccio sperimentale sia spesso il migliore per essere sicuri :) - ancora: il riferimento del pom dà qualche suggerimento sull'ordine: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle .html - per es. le esecuzioni ereditate vengono eseguite per prime Spesso è abbastanza comune che i plugin utilizzino gli escludi/inclusi nell'ordine del pom. Quindi puoi includere qualcosa di speciale escludendo tutto o includi tutti ed escludi qualcosa di speciale. Nel dubbio verrà seguito l'ordine nel pom (nella maggior parte dei casi e plugin) – wemu

risposta

4

Non sono riuscito a trovare la documentazione ufficiale sul plugin surefire, ma in effetti l'esclusione-override-include è un approccio comune e viene applicato anche da Maven in altri contesti simili, come per le risorse.

L'unico ufficiale un info correlate (che ho trovato) proviene dalla Maven POM documentazione ufficiale di riferimento, here:

include: un insieme di file modelli che specificano i file da includere come risorse ai sensi di tale directory specificata, usando * come carattere jolly.

esclude: la stessa struttura di include, ma specifica quali file ignorare. Nei conflitti tra inclusione ed esclusione, l'esclusione vince.

NOTA: ho aggiunto la formattazione in grassetto finale sulla frase interessante.

Quindi più che probabilmente lo stesso approccio viene utilizzato attraverso i plugin ufficiali Maven (in generale, tutti i plugin con org.apache.maven.plugins groupId e maven- prefix come artefatto).

+1

Grande scoperta ... non sono sicuro che dovrei contrassegnarlo come risposta in quanto non è tecnicamente definitivo, ma sicuramente _ interessante. – Lucas