web-dev-qa-db-fra.com

Exécution de tests de concombre directement à partir d'un fichier jar exécutable

J'ai un projet avec concombre et maven et j'utilise également le JUnit.

Je peux exécuter et construire mon projet avec succès à partir d’Eclipse. 

Maintenant, je veux exécuter le test à partir de la ligne de commande dans un autre système sur lequel Eclipse ou concombre ne devrait pas (ne devrait pas être installé). J'ai une idée que nous pouvons créer un fichier JAR à partir de jar, nous pouvons exécuter les tests avec des commandes Java CLI.

Vous trouverez ci-dessous les combinaisons avec lesquelles je tente d'exécuter mes tests. Je colle également les fichiers pom.xml et RunCukesTest.Java.

 enter image description here

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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>pmc</groupId>
    <artifactId>se</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>jar</packaging>

    <name>storeEnabler</name>
    <url>http://maven.Apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-Java</artifactId>
            <version>1.2.0</version>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-testng</artifactId>
            <version>1.2.0</version>
        </dependency>

        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>1.2.4</version>
        </dependency>

        <dependency>
            <groupId>org.seleniumhq.Selenium</groupId>
            <artifactId>Selenium-Java</artifactId>
            <version>2.52.0</version>
        </dependency>

        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>1.4</version>
        </dependency>

        <dependency>
            <groupId>io.appium</groupId>
            <artifactId>Java-client</artifactId>
            <version>3.1.0</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>

        <dependency>
            <groupId>org.Apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.9</version>
        </dependency>

        <dependency>
            <groupId>org.Apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.11-beta3</version>
        </dependency>

        <dependency>
            <groupId>xml-apis</groupId>
            <artifactId>xml-apis</artifactId>
            <version>2.0.2</version>
        </dependency>

        <dependency>
            <groupId>xerces</groupId>
            <artifactId>xercesImpl</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>

    <build>
        <testResources>
            <testResource>
                <directory>${project.basedir}/src/test/Java</directory>
            </testResource>
            <testResource>
                <directory>${project.basedir}/src/test/resource</directory>
            </testResource>
        </testResources>
        <pluginManagement>
            <plugins>
                <plugin>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.1</version>
                    <configuration>
                        <fork>true</fork>
                        <executable>C:\Program Files\Java\jdk1.8.0_60\bin\javac.exe</executable>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.Apache.maven.plugins</groupId>
                    <artifactId>maven-surefire-plugin</artifactId>
                    <version>2.18</version>
                    <dependencies>
                        <dependency>
                            <groupId>org.Apache.maven.surefire</groupId>
                            <artifactId>surefire-junit47</artifactId>
                            <version>2.18</version>
                        </dependency>
                    </dependencies>
                </plugin>
                    <plugin>
                    <artifactId>maven-Assembly-plugin</artifactId>
                    <configuration>
                        <archive>
                            <manifest>
                            <addClasspath>true</addClasspath>
                                <mainClass>cucumber.api.cli.Main</mainClass>
                            </manifest>
                        </archive>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
</project>

RunCukesTest.Java

package se.stepDefinations;


import org.junit.runner.RunWith;

import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@RunWith(Cucumber.class)
@CucumberOptions(features = "src/test/resource/features/Printing.feature:117", plugin = { "pretty",
        "html:target/cucumber-html-report" }, glue = { "se.stepDefinations" }, tags = {})
public class RunCukesTest {

    public static void main(String[] args) throws Exception {


    }
}
  • J'ai ajouté JUNIT Jar in Class path.

Je génère des pots de 2 manières,

1) Exporter le fichier JAR avec -> Projet -> Exporter -> Fichier JAR En sélectionnant MAIN Class dans la dernière étape, en tant que: RunCukesTest, comme j'ai défini la méthode principale ici pour le point d'entrée (avons-nous besoin de cette méthode principale classe???)

Après l'exportation, je lance la commande ci-dessous,

1.1 Java -jar xyz.jar J'ai l'erreur: NoClassDef trouvé: org/junit/runner/JUnitCore 

Alors je l'ai couru de cette façon: 

1.2 Java -cp xyz.jar;junit-4.12.jar org.junit.runner.JUnitCore Il a dit,

JUnit version 4.12
Time:0.001
OK(0 tests) 

Cela ne fonctionnait toujours pas, donc j'ai ajouté l'espace de noms de fichier RunCukesTest à la dernière,
1.3 Java -cp xyz.jar;junit-4.12.jar org.junit.runner.JUnitCore se.stepDefinations.RunCukesTest
Il m’a donné une erreur: tapez concombre.api.junit.Cucumber non présent

2) J'ai donc abandonné l'option d'exportation du fichier jar et j'essaie maintenant d'utiliser le fichier JAR de maven Build. J'ai sélectionné le POM à exécuter avec Maven Build et il a créé 2 fichiers jar dans le dossier cible. , 

1 avec le nom xyz-0.0.1-SNAPSHOT avec 16kb un autre avec 2nd avec
xyz-0.0.1-SNAPSHOT-jar-with-dependencies avec 33mb

1) J'ai couru le plus gros fichier avec des dépendances en utilisant 

Java -jar xyz-0.0.1-SNAPSHOT-jar-with-dependencies.jar

Cela m'a donné un message: 

Pas de chemin d'accès au répertoire des fonctionnalités

2) J'ai donc essayé d'ajouter l'espace de nom au fichier RunCukesTest,

Java -jar xyz-0.0.1-SNAPSHOT-jar-with-dependencies.jar se.stepDefinations.RunCukesTest

J'ai reçu une erreur: pas un fichier ni un répertoire trouvé

Comme le dit l'erreur, bien entendu, il essaie de trouver une fonctionnalité dans le dossier cible.

Là encore, je souhaite exécuter le fichier JAR indépendamment de toute dépendance de fichier de projet de ce type sur un autre ordinateur, par exemple un fichier exécutable.

Toute aide serait appréciée. Merci.

10
Arpan Buch

Je diviserais le problème auquel vous pensez en deux parties.

  • Créer un fichier jar exécutable
  • Exécuter le concombre à partir de votre propre méthode principale

La création d'un fichier jar exécutable à l'aide de Maven peut être effectuée de différentes manières. Une manière de procéder est décrite ici: http://www.thinkcode.se/blog/2011/03/05/create-an-executable-jar-from-maven

C'est un petit exemple qui se concentre uniquement sur l'exécution de quelque chose à partir d'une ligne de commande comme celle-ci:

Java -jar executable-example.jar

L'exemple contient toutes les dépendances. Ils sont tous regroupés dans le même pot. Pas besoin de bocaux supplémentaires.

La prochaine étape serait d’exécuter Cucumber à partir d’une méthode principale. Mon approche serait d'écrire un principal qui exécute la méthode principale Cucumber utilisée pour la version en ligne de commande de Cucumber. La méthode principale utilisée pour exécuter le concombre à partir d'une ligne de commande réside dans la bibliothèque cucumber-Java. Vous le trouverez au cucumber.api.cli.Main

L'exécution d'une méthode principale à partir d'une autre méthode principale se fait comme suit:

public static void main(String[] args) throws Throwable {
    String[] arguments = {"foo", "bar"};
    cucumber.api.cli.Main.main(arguments);
}

où arguments sont les arguments de la ligne de commande avec lesquels vous voulez toujours exécuter Cucumber.

Étant donné ces deux étapes, vous devriez pouvoir exécuter Cucumber à partir de votre propre fichier jar exécutable partout où vous pouvez exécuter un fichier jar.

Notez que vous mélangez la version de la bibliothèque Cucumber dans votre pom. Je voudrais utiliser la dernière version de toutes les bibliothèques. Comparez cucumber-Java, cucumber-testng et cucumber-junit. La dernière version de Cucumber est 1.2.4. Je voudrais l'utiliser pour tous.

Vous trouverez plus d’informations sur l’exécution de Cucumber à partir d’une ligne de commande à l’adresse suivante: https://cucumber.io/docs/reference/jvm#cli-runner

7
Thomas Sundberg
@SpringBootApplication
public class Application {

    public static void main(final String[] args) throws Throwable {
        // SpringApplication.run(TestApplication.class, args);
        JUnitCore.main(CucumberTest.class.getCanonicalName());
    }

}
0
Murphy Lan