Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Maven 直接从可执行jar运行Cucumber测试_Maven_Cucumber_Cucumber Jvm_Cucumber Junit_Cucumber Java - Fatal编程技术网

Maven 直接从可执行jar运行Cucumber测试

Maven 直接从可执行jar运行Cucumber测试,maven,cucumber,cucumber-jvm,cucumber-junit,cucumber-java,Maven,Cucumber,Cucumber Jvm,Cucumber Junit,Cucumber Java,我有一个cucumber和maven的项目,我也在使用JUnit 我能够从Eclipse成功地运行和构建我的项目 现在我想在另一个没有(应该)安装eclipse或cucumber的系统中从命令行运行测试。我有一个想法,我们可以从JAR创建一个JAR,我们可以通过javacli命令运行测试 下面是我尝试从中运行测试的组合,我还粘贴了pom.xml和RunCukesTest.java文件 pom.xml <project xmlns="http://maven.apache.org/POM/

我有一个cucumber和maven的项目,我也在使用JUnit

我能够从Eclipse成功地运行和构建我的项目

现在我想在另一个没有(应该)安装eclipse或cucumber的系统中从命令行运行测试。我有一个想法,我们可以从JAR创建一个JAR,我们可以通过javacli命令运行测试

下面是我尝试从中运行测试的组合,我还粘贴了pom.xml和RunCukesTest.java文件

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>
  • 我在类路径中添加了JUnitJAR
我以两种方式生成JAR

1) 使用->项目->导出->JAR文件导出JAR 在最后一步中选择MAIN类为:RunCukesTest,因为我在这里为入口点定义了MAIN方法(我们在这个类中需要这个MAIN方法吗?)

导出后,我在下面运行命令

1.1
java-jar xyz.jar
我得到错误:找到NoClassDef:org/junit/runner/JUnitCore

所以我这样运行:

1.2
java-cp xyz.jar;junit-4.12.jar org.junit.runner.JUnitCore
上面说,

JUnit version 4.12
Time:0.001
OK(0 tests) 
它仍然不起作用,所以我在最后添加了RunCukesTest文件名称空间,
1.3
java-cp xyz.jar;junit-4.12.jar org.junit.runner.JUnitCore se.stepDefinitions.RunCukesTest

它给了我错误:输入cumber.api.junit.cumber not present

2) 所以我放弃了导出jar的选项,现在我正尝试使用maven构建中的jar。 我选择使用Maven Build运行POM,它在目标文件夹中创建了2个JAR

名称为xyz-0.0.1的1个快照具有16kb,另一个快照具有第二个快照具有
xyz-0.0.1-SNAPSHOT-jar-with-dependencies,33mb

1) 我使用

java -jar xyz-0.0.1-SNAPSHOT-jar-with-dependencies.jar
它给了我一个信息:

找不到功能目录的路径

2) 所以我尝试将名称空间附加到RunCukesTest文件

java -jar xyz-0.0.1-SNAPSHOT-jar-with-dependencies.jar se.stepDefinations.RunCukesTest
我收到一个错误:找不到文件或目录

,当然,正如错误所说,它正在尝试在目标文件夹中查找功能

同样,我希望在任何其他计算机(如可执行文件)中独立于任何此类项目文件依赖项运行JAR


任何帮助都将不胜感激。谢谢。

我将把你正在思考的问题分为两部分

  • 创建一个可执行的jar
  • 从你自己的主要方法运行黄瓜
使用Maven创建可执行jar可以用不同的方式完成。这里介绍了一种方法:

这是一个小示例,只关注从命令行执行以下内容:

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

    apply plugin: 'java'
    
    sourceSets {
        main {
            java {
                srcDirs = ['src/main/java']
            }
            resources {
                srcDirs = ['src/main/resources']
            }
        }
    }
    
    dependencies {
         // Include your dependencies here
         compile '...'
     }
    
    configurations {
        cucumberRuntime {
            extendsFrom compile
        }
    }
    
    jar {
        from {
            // Package all dependencies in the .jar
            configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
        }
        manifest {
            // Indicate the main class for the .jar file
            attributes 'Main-Class': 'CukesRunner'
        }
    }

java-jar可执行文件-example.jar

该示例包含所有依赖项。它们都捆在同一个罐子里。不需要任何额外的罐子

下一步是从主方法执行Cucumber。我的方法是编写一个main,执行Cucumber命令行版本中使用的Cucumber main方法。用于从命令行运行cucumber的主要方法位于
cucumberjava
库中。您可以在cucumber.api.cli.Main上找到它

从另一个主方法运行主方法如下:

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

    apply plugin: 'java'
    
    sourceSets {
        main {
            java {
                srcDirs = ['src/main/java']
            }
            resources {
                srcDirs = ['src/main/resources']
            }
        }
    }
    
    dependencies {
         // Include your dependencies here
         compile '...'
     }
    
    configurations {
        cucumberRuntime {
            extendsFrom compile
        }
    }
    
    jar {
        from {
            // Package all dependencies in the .jar
            configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
        }
        manifest {
            // Indicate the main class for the .jar file
            attributes 'Main-Class': 'CukesRunner'
        }
    }

其中,arguments是始终要使用的命令行参数

考虑到这两个步骤,您应该能够从自己的可执行jar执行Cucumber,无论您在哪里都可以执行jar

请注意,您正在pom中混合Cucumber的库版本。我会使用所有库的最新版本。比较
cucumberjava
cucumbertestng
cucumberjunit
。最新的Cucumber版本是1.2.4。我会把它用在所有的人身上


有关从命令行运行Cucumber的更多信息,请参见此处:

我想扩展已接受的答案以支持Gradle,因为这可能对某些人有所帮助

这是您的项目结构

  • .根
    • src/
      • 主要/
        • java/-->将.java文件放在此处
          • CukesRunner.java-->这是您的主文件
        • 资源
          • features/-->将.feature文件放在此处
build.gradle文件应该如下所示:

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

    apply plugin: 'java'
    
    sourceSets {
        main {
            java {
                srcDirs = ['src/main/java']
            }
            resources {
                srcDirs = ['src/main/resources']
            }
        }
    }
    
    dependencies {
         // Include your dependencies here
         compile '...'
     }
    
    configurations {
        cucumberRuntime {
            extendsFrom compile
        }
    }
    
    jar {
        from {
            // Package all dependencies in the .jar
            configurations.runtimeClasspath.collect { it.isDirectory() ? it : zipTree(it) }
        }
        manifest {
            // Indicate the main class for the .jar file
            attributes 'Main-Class': 'CukesRunner'
        }
    }

然后,您可以定制
CukesRunner.java
,就像接受的答案所建议的那样,但请确保调用与jar文件一起压缩的功能:

公共类CukesRunner{
公共静态void main(字符串[]args)抛出可丢弃的{
最终字符串[]参数=新字符串[]{
“--glue”、”,
“classpath:features”//这将在jar文件中查找类路径
};
cumber.api.cli.Main.Main(参数);
}
}

应该使用
getName()
而不是
getCanonicalName()
来运行嵌套类。这里的一个问题是,在/test下放置的任何内容在默认情况下都不会进入jar文件。这就是为什么它找不到你的测试跑步者