IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Maven Java Discussion :

Comment exécuter une tâche après la phase de test, même en cas d'échec ?


Sujet :

Maven Java

  1. #1
    Membre expérimenté

    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 144
    Par défaut Comment exécuter une tâche après la phase de test, même en cas d'échec ?
    Bonjour,

    pour tester un programme avec une interface utilisateur en Swing, j'utilise Fest. Le problème de Fest est qu'avec ma configuration à 2 écrans, l'ouverture des fenêtres a tendance à se faire sur un écran, et les clics souris sur un autre...
    J'ai résolu le problème avec un script qui me crée un affichage virtuel avec Xvfb. Je le lance grâce au plugin exec-maven lors de la phase test-compile, de manière à en disposer pour les tests. Maintenant, les tests de l'interface graphique se font sur l'affichage virtuel, et je ne suis plus embêté par les mouvements du curseur de la souris.
    Il ne me reste plus qu'à arrêter Xvfb à l'issue des tests. Je fais ceci toujours avec mon script lors de la phase test. Tout va bien en cas de succès des tests. Malheureusement, si les tests unitaires échouent, le build s'arrête et mon script ne se lance jamais.
    Je ne veux pas configurer le plugin surefire pour ignorer l'échec des tests : mon script se lance bien, mais le build est considéré comme réussi...

    Voici un extrait de mon pom.xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    ...
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>Launching Xvfb</id>
                            <phase>test-compile</phase>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                            <configuration>
                                <environmentVariables>
                                    <DISPLAY>${display}</DISPLAY>
                                </environmentVariables>
                                <executable>bash</executable>
                                <arguments>
                                    <argument>${project.build.directory}/test-classes/scripts/Xvfb_launch.sh</argument>
                                    <argument>start</argument>
                                </arguments>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <configuration>
                        <executable>bash</executable>
                        <arguments>
                            <argument>${project.build.directory}/test-classes/scripts/Xvfb_launch.sh</argument>
                            <argument>stop</argument>
                        </arguments>
                    </configuration>
                    <executions>
                        <execution>
                            <id>Stopping Xvfb</id>
                            <phase>test</phase>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                            <configuration>
                                <testFailureIgnore>true</testFailureIgnore>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
    ...
    Merci à tous ceux qui pourront m'aider.

  2. #2
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Bonsoir,

    Il suffit a priori de mettre la propriété testFailureIgnore à true pour le plugin surefire :

    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <configuration>
                <testFailureIgnore>true</testFailureIgnore>
            </configuration>
        </plugin>
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  3. #3
    Membre expérimenté

    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 144
    Par défaut
    J'avais déjà mis testFailureIgnore à true, et effectivement ça fonctionne. Mais cette solution ne me satisfait pas, car même avec des tests en échec, le build est considéré comme réussi. Moi, je veux qu'il échoue si les tests ne passent pas.

  4. #4
    Rédacteur
    Avatar de romaintaz
    Homme Profil pro
    Java craftsman
    Inscrit en
    Juillet 2005
    Messages
    3 790
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Java craftsman
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2005
    Messages : 3 790
    Par défaut
    Bon, ça risque d'être plus compliqué.

    Pour Surefire, il y a 3 façons de voir le résultat du build :

    1. Le build est réussi parce que les tests réussissent;
    2. Le build réussi bien qu'il y ait des échecs mais on lui demande de les ignorer;
    3. Le build échoue parce qu'il y a des échecs.

    Actuellement, on se trouve dans le cas numéro 2. Mais dans les 2 premiers cas, le cycle de vie du build continue et la phase de tests est considérée comme réussie.

    Une idée serait d'ajouter à une phase plus avancée (par exemple package ou install ?) une vérification du succès des tests. Par exemple, le plugin verifier permet de vérifier l'existence ou le contenu d'un fichier. Il faudrait regarder s'il est possible de demander à ce plugin de vérifier les résultats des fichiers surefire (dans target/surefire-reports/*.txt) et de traquer l'absence (ou la présence) d'une erreur (ou d'une stacktrace). Si une telle erreur est trouvée, alors mettre le build en échec.

    Si l'idée précédente échoue, il est aussi possible d'utiliser le plugin enforcer, en créant sa propre règle (c'est très facile à faire) qui ira faire ces vérifications...
    Nous sommes tous semblables, alors acceptons nos différences !
    --------------------------------------------------------------
    Liens : Blog | Page DVP | Twitter
    Articles : Hudson | Sonar | Outils de builds Java Maven 3 | Play! 1 | TeamCity| CitConf 2009
    Critiques : Apache Maven

  5. #5
    Membre expérimenté

    Homme Profil pro
    Développeur Java
    Inscrit en
    Décembre 2005
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Décembre 2005
    Messages : 144
    Par défaut
    Ça y est, j'ai réussi avec le plugin enforcer. J'ai créé une règle une règle perso qui vérifie la présence d'une expression régulière dans tous, au moins un ou aucun fichier dans un répertoire. J'ai activé ce plugin pour la phase prepare-package, et je cherche dans les fichiers *Test.txt la présence de FAILURE. Si je trouve, c'est que les tests ont échoué.
    Voici un extrait de mon nouveau pom :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
     
    <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>2.3.2</version>
                    <configuration>
                        <source>1.7</source>
                        <target>1.7</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>Launching Xvfb</id>
                            <phase>test-compile</phase>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                            <configuration>
                                <environmentVariables>
                                    <DISPLAY>${display}</DISPLAY>
                                </environmentVariables>
                                <executable>bash</executable>
                                <arguments>
                                    <argument>${project.build.directory}/test-classes/scripts/xvfb.sh</argument>
                                    <argument>start</argument>
                                </arguments>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.codehaus.mojo</groupId>
                    <artifactId>exec-maven-plugin</artifactId>
                    <configuration>
                        <executable>bash</executable>
                        <arguments>
                            <argument>${project.build.directory}/test-classes/scripts/xvfb.sh</argument>
                            <argument>stop</argument>
                        </arguments>
                    </configuration>
                    <executions>
                        <execution>
                            <id>Stopping Xvfb</id>
                            <phase>test</phase>
                            <goals>
                                <goal>exec</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <configuration>
                        <testFailureIgnore>true</testFailureIgnore>
                        <environmentVariables>
                            <DISPLAY>${display}</DISPLAY>
                        </environmentVariables>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-enforcer-plugin</artifactId>
                    <version>1.0.1</version>
                    <dependencies>
                        <dependency>
                            <groupId>fr.atatorus</groupId>
                            <artifactId>file-content-enforcer</artifactId>
                            <version>1.0-SNAPSHOT</version>
                        </dependency>
                    </dependencies>
                    <configuration>
                        <rules>
                            <testChecking implementation="fr.atatorus.enforcer.FileContentEnforcer">
                                <location>${project.build.directory}/surefire-reports</location>
                                <filePattern>.*Test.txt</filePattern>
                                <regexp>FAILURE</regexp>
                                <condition>NO_FILES</condition>
                            </testChecking>
                        </rules>
                        <fail>true</fail>
                    </configuration>
                    <executions>
                        <execution>
                            <id>Check failed tests</id>
                            <phase>prepare-package</phase>
                            <goals>
                                <goal>enforce</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    Et à tritre info, voici ma classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
     
    public class FileContentEnforcer implements EnforcerRule {
     
        private String location;
        private String filePattern;
        private String regexp;
        private Rule condition = Rule.AT_LEAST_ONE_FILE;
     
        @Override
        public void execute(EnforcerRuleHelper helper) throws EnforcerRuleException {
            Path path = FileSystems.getDefault().getPath(location);
            Visitor visitor = new Visitor(filePattern, regexp);
            try {
                Files.walkFileTree(path, visitor);
                if ((visitor.patternFound && condition == Rule.NO_FILES) || ( !visitor.patternFound && condition != Rule.NO_FILES)) {
                    throw new EnforcerRuleException(visitor.message);
                }
            } catch (IOException e) {
                throw new EnforcerRuleException("I/O error", e);
            }
     
        }
     
        @Override
        public String getCacheId() {
            return "false";
        }
     
        @Override
        public boolean isCacheable() {
            return false;
        }
     
        @Override
        public boolean isResultValid(EnforcerRule rule) {
            return true;
        }
     
        public void setLocation(String location) {
            this.location = location;
        }
     
        public void setFilePattern(String filePattern) {
            this.filePattern = filePattern;
        }
     
        public void setRegexp(String regexp) {
            this.regexp = regexp;
        }
     
        public void setCondition(Rule condition) {
            this.condition = condition;
        }
     
        private class Visitor extends SimpleFileVisitor<Path> {
     
            private Pattern filePatternToTest;
            private Pattern contentPatternToFind;
            private boolean patternFound = false;
            private String message;
     
            public Visitor(String filePattern, String regexp) {
                filePatternToTest = Pattern.compile(filePattern);
                contentPatternToFind = Pattern.compile(regexp);
            }
     
            @Override
            public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
                String fileName = file.getFileName().toString();
                Matcher matcher = filePatternToTest.matcher(fileName);
                if ( !matcher.matches()) {
                    return FileVisitResult.CONTINUE;
                }
                List<String> lines = Files.readAllLines(file, Charset.defaultCharset());
                boolean found = false;
                for (String line : lines) {
                    Matcher matcher2 = contentPatternToFind.matcher(line);
                    if (matcher2.find()) {
                        found = true;
                        break;
                    }
                }
                if (found) {
                    patternFound = true;
                    message = "File " + fileName + " contain pattern " + contentPatternToFind;
                    if (condition == Rule.ALL_FILES) {
                        return FileVisitResult.CONTINUE;
                    }
                    return FileVisitResult.TERMINATE;
                } else {
                    patternFound = false;
                    message = "File " + fileName + " does not contain pattern " + contentPatternToFind;
                    if (condition == Rule.ALL_FILES) {
                        return FileVisitResult.TERMINATE;
                    }
                    return FileVisitResult.CONTINUE;
                }
            }
     
        }
     
    }
    Merci beaucoup, je ne connaissais pas ce plugin. C'est peut être un peu lourd pour mon cas, mais il marche très bien.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [FAQ] Syntaxe JavaScript | (3) Comment exécuter une fonction après un délai ?
    Par ctrii dans le forum Contributions JavaScript / AJAX
    Réponses: 0
    Dernier message: 14/01/2013, 16h37
  2. Comment exécuter une tâche avec un signal ?
    Par fearyourself dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 17h30
  3. Réponses: 2
    Dernier message: 29/07/2008, 15h04
  4. comment faire pour démarrer une tâche apres une autre
    Par dh01 dans le forum Autres Logiciels
    Réponses: 2
    Dernier message: 04/12/2005, 14h57
  5. Comment exécuter une DLL ?
    Par chleuh dans le forum Langage
    Réponses: 4
    Dernier message: 29/06/2005, 14h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo