2012-08-14 21 views
15

Podczas korzystania z wtyczki maven-surefire i obejmuje i wyklucza, w jakiej kolejności są przetwarzane? Ponadto, jeśli masz 3 zestawy testów, z których pierwszy to zestaw podstawowy, a drugi i trzeci to przypadki specjalne, czy możesz użyć profili do dalszego włączania/wyłączania? W jaki sposób zostaną scalone ustawienia włączania/wyłączania profilu? Na przykład, chciałbym zrobić coś takiego:maven-surefire-plugin włącza/wyklucza pierwszeństwo

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

A potem być w stanie uruchomić tak:

mvn package -P connectedToProdNetwork 

lub

mvn package -P runForAsLongAsYouNeed 

lub

mvn package -P connectedToProdNetwork,runForAsLongAsYouNeed 

---- AKTUALIZACJA -----

Korzystanie mvn help:effective-pom -P [profileA] udało mi się ustalić, że jeśli mogę określić pojedynczy profil, powstały skuteczne pom będą:

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

A gdybym dostarczyć więcej niż jeden profil, 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> 

I na koniec, jeśli dodaję atrybut combine.children="append" do elementu <includes> konfiguracji profilu i dostarczę oba profile, 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> 

Teraz jednak, że każdy plik jest określona zarówno jako <include> i <exclude>, co się dzieje?

---- UPDATE 2 ----

Faktycznie działa kompilacji z tej konfiguracji:

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

robi NIE prowadzony Testa, więc wydaje się <exclude> będzie obezwładnić <include>. Zauważ, że dla kompletności odwróciłem zamówienie i wstawiłem <excludes> przed <includes>, ale zachowanie się nie zmieniło. Jeśli ktoś może znaleźć gdzieś w pobliżu kodu źródłowego, gdzie to zachowanie jest opisane, chętnie odpowiem na nie ...

+3

Wyklucza przesłonięcia, ponieważ zazwyczaj ludzie zawierają większy zestaw niż potrzebują i po prostu potrzebują trochę wykupionego. Zwykle oznacza to krótszą listę i mniej pracy. – Steven

+0

@Steven, yeah, pasuje do tego, czego doświadczyłem podczas testów. Czy wiesz, gdziekolwiek jest to oficjalnie stwierdzone, aby wiedzieć, że nie zmienią tego zachowania w przyszłości? W każdym razie, dzięki człowieku. – Lucas

+0

Myślę, że podejście eksperymentalne jest często najlepsze, aby być pewnym :) - nadal: referencja pom dostarcza wskazówek na temat zamówienia: http://maven.apache.org/guides/introduction/introduction-to-the-lifecycle .html - np. odziedziczone egzekucje są uruchamiane jako pierwsze. Często zdarza się, że wtyczki używają wykluczeń/włączeń w kolejności pom. Możesz więc dodać coś specjalnego, wykluczając wszystko lub włączając wszystko i wykluczając coś wyjątkowego. W razie wątpliwości kolejność w pom będzie przestrzegana (w większości przypadków i wtyczek). – wemu

Odpowiedz

4

Nie mogłem znaleźć oficjalnej dokumentacji na temat wtyczki surefire, ale w rzeczywistości wykluczenie-override-include jest powszechnym podejściem i jest również stosowane przez Mavena w innych podobnych kontekstach, takich jak zasoby.

Jedynym oficjalnym Podobne Info (znalazłem) pochodzi z oficjalnej dokumentacji referencyjnego Maven POM, here:

obejmuje: zestaw plików wzorców, które określić pliki włączyć jako zasoby mocy, że określony katalog, używając * jako symbolu wieloznacznego.

wyklucza: Ta sama struktura, co zawiera, ale określa, które pliki należy zignorować. W konfliktach między uwzględnianiem i wykluczaniem wyklucz wygrane.

UWAGA: Dodałem ostateczne wytłuszczenie na interesującym wyciągu.

Więc bardziej niż prawdopodobnie to samo podejście jest stosowane w oficjalnych wtyczkach maven (ogólnie, wszystkie wtyczki mają org.apache.maven.plugins groupId i maven- prefix jako artifactId).

+1

Świetne odkrycie ... nie jestem pewny, że powinienem oznaczyć to jako odpowiedź, ponieważ nie jest ona technicznie ostateczna, ale zdecydowanie _użyteczna_ informacja. – Lucas