web-dev-qa-db-fra.com

Existe-t-il un moyen de ne passer qu’un seul test dans Maven?

J'aimerais ne sauter qu'un seul test lors du lancement de mvn install.

Y-a-t-il un moyen de faire ça ?

51
paulgreg

Avec Junit 4, j'ajoute une annotation @Ignore lorsque je souhaite le faire. Cela fonctionnerait pour vous, à moins que vous ne vouliez parfois ignorer le test, ou seulement lorsque le build est exécuté à partir de maven. Si tel est le cas, je demanderais alors "Pourquoi?"

Les tests devraient devraient être cohérents, ils devraient être portables, et ils devraient passer toujours. Si un test spécifique est problématique, je pourrais envisager de le réécrire, de le supprimer complètement ou de le déplacer vers une suite de tests ou un projet différent.

17
Steve Reed

Vous pouvez spécifier un modèle d'exclusion pour l'option -Dtest en le préfixant d'un ! (point d'exclamation). Par exemple.,

mvn -Dtest=\!FlakyTest* install

Je l'ai trouvé dans ici et il a été vérifié qu'il fonctionne. Par exemple, j'ai pu passer ce test floconneux de Jenkins en utilisant:

mvn -Dtest=\!CronTabTest* package
35
haridsv

Il est normal d'exclure les tests d'intégration mais d'inclure les tests unitaires ..__ Pour ce faire, je suggère de nommer tous les tests d'intégration avec un IntegrationTest postfixé (par exemple AbcIntegrationTest.Java). 

et ensuite dans votre maven build mettez ce qui suit:

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

Lorsque vous compilez avec cela, tous les tests d'intégration sont exclus, mais tous les autres tests (test unitaire, par exemple) sont exécutés. Parfait :-)

Pour plus d’informations sur l’exclusion et l’inclusion des tests lors de l’exécution du test, lisez

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

PS Pour exclure un seul test, vous devez simplement le nommer explicitement dans la liste d'exclusion. Facile.

6
fergal_dd

Regardez cette solution , en utilisant les annotations @Category

public class AccountTest {

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

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

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

Que vous exécutez ensuite en utilisant une suite de tests:

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

je pense que cela devrait fonctionner si vous utilisez cette commande:

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

(pour changer les tests pom.xml et test-class comme suit et utiliser 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>

classe de test:

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

Si vous souhaitez utiliser la CLI pour exclure un seul test, vous devez utiliser les indicateurs -Dtest et -Dit.test.

Veillez à réinitialiser les valeurs par défaut. Lorsque vous utilisez la notation !, toutes les valeurs par défaut sont effacées et vous devez les rétablir. Pour les tests normaux exécutés par surefire, vous devez ajouter *Test, Test*, *Tests, *TestCase, tandis que pour les tests d'intégration exécutés par failsafe, vous devez ajouter IT*, *IT, *ITCase.

Vous pouvez trouver plus d'informations ici https://maven.Apache.org/surefire/maven-surefire-plugin/examples/inclusion-exclusion.html (tests normaux)

et ici https://maven.Apache.org/surefire/maven-failsafe-plugin/examples/inclusion-exclusion.html (tests d'intégration)

-Dit.test='!ITsometestIT, IT*, *IT, *ITCase'

Une commande complète mvn pourrait être celle-ci:

mvn -e -B -Dtest='!unitTestABC, *Test, Test*, *Tests, *TestCase' -Dit.test='!ITintegrationTestABCIT, IT*, *IT, *ITCase' -DfailIfNoTests=false clean install

N'oubliez pas d'utiliser ' et NOT ". Lorsque vous utilisez des guillemets, tout ! à l'intérieur sera évalué par bash.

Rappelez-vous également que les tests d'intégration ne sont pas exécutés lorsque mvn test. Avec mvn verify, seuls les tests d'intégration seront exécutés et non les tests unitaires.

0
Naramsim