2009-05-07 4 views

Antwort

18

Mit Junit 4 füge ich eine @Ignore Annotation hinzu, wenn ich das tun möchte. Dies würde für Sie funktionieren, es sei denn, Sie möchten den Test nur gelegentlich ignorieren oder ignorieren ihn nur, wenn der Build von maven ausgeführt wird. Wenn dies der Fall ist, würde ich fragen: "Warum?"

Tests konsistent sein sollten, sie sollten tragbar sein, und sie sollten immer passieren. Wenn ein spezifischer Test problematisch ist, würde ich erwägen, ihn neu zu schreiben, ihn vollständig zu entfernen oder ihn in eine andere Testsuite oder ein anderes Projekt zu verschieben.

+5

Der Anwendungsfall ist, dass jemand in meinem Team gerade einen Test festlegt und ich alle anderen Tests starten möchte, aber nicht diesen, bis es wieder funktioniert . Du hast also recht, ich sollte es per Code vorübergehend deaktivieren. – paulgreg

+0

Dies funktioniert auch auf Klassenebene. Ich habe einen Basistest und die Pom-Konfiguration ist nicht änderbar (es ist in einem gemeinsamen Eltern Pom), so dass Maven meine Tests fehlschlägt, weil es "keine Tests" in der abstrakten Klasse sagt. Dies ist eine großartige Lösung. – ashes999

+1

Dies bedeutet, dass Sie bearbeiten müssen, um die Änderung rückgängig zu machen. Gleiches gilt für die nächste Lösung: – jasonnerothin

4

ich denke, das sollte funktionieren, wenn Sie diesen Befehl verwenden:

mvn archetype:create -DgroupId=test -DartifactId=test 

(für Test Änderung pom.xml und Test-Klasse auf die folgende und verwenden mvn install)

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
<modelVersion>4.0.0</modelVersion> 
<groupId>test</groupId> 
<artifactId>test</artifactId> 
<packaging>jar</packaging> 
<version>1.0-SNAPSHOT</version> 
<name>test</name> 
<url>http://maven.apache.org</url> 
<build> 
    <plugins> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-compiler-plugin</artifactId> 
      <configuration> 
       <source>1.5</source> 
       <target>1.5</target> 
      </configuration> 
     </plugin> 
     <plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <excludes> 
        <exclude> 
         test/AppTest.java 
       </exclude> 
       </excludes> 
      </configuration> 
     </plugin> 
    </plugins> 
</build> 
<dependencies> 
    <dependency> 
     <groupId>junit</groupId> 
     <artifactId>junit</artifactId> 
     <version>4.5</version> 
     <scope>test</scope> 
    </dependency> 
</dependencies> 

Test-Klasse:

package test; 
import org.junit.Test; 
import static org.junit.Assert.fail; 
public class AppTest 
{ 
    @Test 
    public void test_it() { 
     fail("not implemented"); 
    } 
} 
5

Werfen Sie einen Blick auf this solution, mit @Category Anmerkungen

public class AccountTest { 

    @Test 
    @Category(IntegrationTests.class) 
    public void thisTestWillTakeSomeTime() { 
     ... 
    } 

    @Test 
    @Category(IntegrationTests.class) 
    public void thisTestWillTakeEvenLonger() { 
     ... 
    } 

    @Test 
    public void thisOneIsRealFast() { 
     ... 
    } 
} 

die Sie dann eine Testsuite ausgeführt werden:

@RunWith(Categories.class) 
@IncludeCategory(SlowTests.class) 
@SuiteClasses({ AccountTest.class, ClientTest.class }) 
public class LongRunningTestSuite {} 
+0

Ist es möglich, die Kategorie in der maven-Befehlszeile anzugeben/ohne den Code zu berühren? –

4

Es ist normal, dass Integrationstests ausgeschlossen werden müssen, aber Unit-Tests müssen enthalten sein. Um dies zu erreichen, empfehle ich, alle Integrationstests mit einem Postfix IntegrationTest (z. B. AbcIntegrationTest.java) zu benennen.

und dann in Ihrem Maven Build setzen folgendes:

<plugin> 
      <groupId>org.apache.maven.plugins</groupId> 
      <artifactId>maven-surefire-plugin</artifactId> 
      <configuration> 
       <excludes> 
        <exclude>**/*IntegrationTest.java</exclude> 
       </excludes> 
      </configuration> 
     </plugin> 

Wenn Sie mit diesem alle Integrationstests bauen ausgeschlossen werden wil, aber alle anderen Tests (Unit-Test zum Beispiel) ausgeführt werden. Perfekt :-)

Für weitere Informationen über exclusing und einschließlich Tests während des Testlaufs, lesen

http://maven.apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html

PS mit einem einzigen Test Um exlude müssen Sie einfach es explizit in der Liste ausschließen nennen. Einfach.

26

Sie können ein Ausschlussmuster für die Option -Dtest angeben, indem Sie ihm ein ! (Ausrufezeichen) voranstellen. Z. B.

mvn -Dtest=\!FlakyTest* install 

es in here gefunden und verifiziert zu arbeiten. Z.B.Konnte ich this flockig Jenkins Test überspringen, indem Sie:

mvn -Dtest=\!CronTabTest* package 
+1

Dieses Feature wurde in 2.19 implementiert, siehe [die Dokumentation] (http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html#Multiple_Formats_in_One). – rdvdijk

+0

Gibt es eine Möglichkeit, Einschließen und Ausschließen zu kombinieren? Z.B. Ich möchte Cron * Test außer CronFlakyTest ausführen. Ich habe versucht 'mvn -Dtest =" \! CronFlakyTest, Cron * Test "installieren", aber das läuft immer noch den flockigen Test –

Verwandte Themen