2009-05-21 4 views
31

Wir haben Hunderte von Tests für unseren Integrations-Test-Phasen-Lebenszyklus in Maven definiert, und es dauert sehr lange, bis sie abgeschlossen sind.So führen Sie einen individuellen Test im Integrationstest-Ziel in maven

Was ich tun möchte, ist nur einen Test in der integration-test ausführen. Ich habe es versucht:

mvn -Dtest=<my-test> integration-test 

aber das funktioniert nicht. Die -Dtest führt nur die Tests im Unit-Test-Ziel durch, nicht die Integrationstest-Phase. Ich versuchte stattdessen -Dintegration-test=<my-test>, und das wurde ignoriert.

Gibt es eine Möglichkeit, das zu tun?


Meine Konfiguration ist:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <executions> 
     <execution> 
      <id>surefire-it</id> 
      <phase>integration-test</phase> 
      <goals> 
       <goal>test</goal> 
      </goals> 
      <configuration> 
       <excludes> 
        <exclude>none</exclude> 
       </excludes> 
       <includes> 
        <include>**/api/**</include> 
       </includes> 
    ..... 
+0

Ich habe gerade dies auf meinem Projekt getan und es hat funktioniert. Gibt es eine Chance, dass du den todsicheren Abschnitt aus dem Pom posten kannst? –

+0

org.apache.maven.plugins Maven-todsichere-Plugin todsichere-it Integrationstest Test keine **/api/** ..... – Jalpesh

+0

ich wegen einer Beschränkung in der vollen Sache nicht veröffentlichen können. Aber das ist der Kern davon. – Jalpesh

Antwort

2

ich JUnit bin nicht sicher, aber für TestNG würde die Strategie sein, eine Suite XML-Datei mit nur dem einen Test zu definieren und dann in Ihrem POM Konfigurieren Sie das Surefire-Plugin so, dass es nur ausgeführt wird. In Ihrem POM, Sie so etwas wie dieses haben würde (Disclaimer, dann ist dies nicht getestet):

<plugin> 
    <artifactId>maven-surefire-plugin</artifactId> 
    <executions> 
     <execution> 
     <phase>integration-test</phase> 
     <configuration> 
      <suiteXmlFiles> 
      <suiteXmlFile>single-test.xml</suiteXmlFile> 
      </suiteXmlFiles> 
     </configuration> 
     <goals> 
      <goal>run</goal> 
     </goals> 
     </execution> 
    </executions> 
    </plugin> 

die Suite-Datei zu konfigurieren, finden Sie http://testng.org/doc/documentation-main.html

+0

Ich stimme James zu. TestNG ist dafür geeignet, aber ich denke, es ist besser TestNG Gruppen eingesetzt werden: @Test (Gruppen = { "slow_test"}) Dann in Ihrer TestNG Suite: Dann können Sie immer zählen/bestimmte Gruppen ausschließen –

3

ich durch diese gekämpft, und ich erstellt ein zusätzliches Profil zu verwenden als ich nur einen Integrationstest durchführen wollte. Ich hoffe, dass ich hier erfolgreich nur den rechten Teil extrahiert haben:

<profile> 
     <id>integrationTestSingle</id> 
     <build> 
      <plugins> 
       <plugin> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <executions> 
         <execution> 
          <id>surefire-it</id> 
          <phase>integration-test</phase> 
          <goals> 
           <goal>test</goal> 
          </goals> 
          <configuration> 
           <includes> 
            <include>**/integration/**/${test}.java</include> 
           </includes> 
           <skipTests>false</skipTests> 
          </configuration> 
         </execution> 
        </executions> 
        <configuration> 
         <argLine>-Xms256M -Xmx768M -XX:MaxPermSize=256M</argLine> 
        </configuration> 
       </plugin> 

       <plugin> 
        <artifactId>maven-surefire-plugin</artifactId> 
        <executions> 
         <execution> 
          <id>default-test</id>         
          <configuration> 
           <skipTests>true</skipTests> 
          </configuration> 
         </execution> 
        </executions> 

       </plugin> 
      </plugins> 
     </build> 
    </profile> 

Nun rufe ich Maven mit dem integrationTestSingle Profil und mit -DfailIfNoTests=false -Dtest=NameOfTest, und es spielt keine der regelmäßigen Tests während der regulären „Testlauf "Phase, und läuft nur die NameOfTest Test während der Integrationstest-Phase.

26

Wenn Sie die Maven failsafe plugin verwenden, können Sie einen einzelnen Integrationstest über

mvn -Dit.test=your.TestCase verify 

Siehe the failsafe plugin docs for more info laufen.

+1

Dies ist für mich gearbeitet 2013.07.26 mit Plugin-Version 2.15 und Maven 3.1.0 trotz der anderen Antwort sagt. Die andere Antwort scheint ein Bug gewesen zu sein. – ArtB

+1

verifiziert für mvn 3.2.5, plugin 2.18. läuft ein Integrationstest: mvn Integration-Test -Dit.test = MyClassIT dies jedoch läuft auch Unit-Tests: mvn überprüfen -Dit.test = MyClassIT Beachten Sie, – user77115

+0

, dass diese nach wie vor Unit-Tests laufen könnten. Um die Ausführung von Komponententests auszuschalten, fügen Sie '-Dtest = foo -DfailIfNoTests = false 'hinzu (vorausgesetzt, dass foo nicht existiert), siehe https://stackoverflow.com/questions/6612344/prevent-unit-tests-in-maven- aber erlauben-Integration-Tests. – asmaier

21

Die Failsafe documentation würden Sie den Test wie so angeben:

mvn -Dit.test=BrokenIT verify 

jedoch -Dit.test nicht mehr zur Arbeit erscheint. Derselbe Parameter, der zum Angeben eines Surefire-Tests verwendet wird, funktioniert offensichtlich auch für Failsafe. Zum Beispiel:

mvn -Dtest=WorksIT verify 

ich eingereicht habe eine bug (EDIT:, die wie in 2.12 "reproduzieren kann nicht" geschlossen wurde) zur Korrektur der Dokumentation.

+2

Dies sollte als Antwort akzeptiert werden. – whaley

+0

Kann Build-Helper-Maven-Plugin nicht auslösen, welches die Testumgebung initiert. – okwap

+0

@okwap Das klingt nach etwas Besonderem für Ihr Projekt und Plugin-Setup und nicht nach einem Failsafe/Integrationstestproblem. – Lyle

0

Gerade lief ich selbst hinein. So etwas wie dies funktionierte gut für mich:

mvn -Pintegration-test -Dtest=<my-test> 

Der Trick sicherzustellen war, dass die Test-Gruppe vor dem -Dtest Abschnitt erwähnt wurde.

2

einfach hinzufügen -DfailIfNoTests=false funktioniert für mich mit testNG. Etwas wie dieses:

mvn integration-test -Dtest=aITest -DfailIfNoTests=false