直接从可执行jar运行Cucumber测试 [英] Running Cucumber tests directly from executable jar

查看:91
本文介绍了直接从可执行jar运行Cucumber测试的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个黄瓜和Maven项目,我也在使用JUnit.

I have a project with cucumber and maven also I am using the JUnit.

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

I am able to run and build my project successfully from Eclipse.

现在我想在另一个没有安装Eclipse或Cucumber的系统中从命令行运行测试.我有一个想法,我们可以从jar中创建一个JAR,然后可以通过java cli命令运行测试.

Now I want to run the test from command line in another system which does(should) not have eclipse or cucumber installed. I have an idea that we can create a JAR from jar we can run the tests by java cli commands.

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

Below are the combinations I am trying to run my tests from , also I am pasting the pom.xml and RunCukesTest.java file..

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

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 {


    }
}

  • 我已在类路径中添加了JUNIT Jar.
  • 我以两种方式生成罐子,

    I am generating jars in 2 ways,

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

    1) Exporting JAR using - > Project ->Export -> JAR File Selecting MAIN Class in the last step as : RunCukesTest as I have defined main method here for the entry point(do we require this main method in this class???)

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

    After the export , I am running below command ,

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

    1.1 java -jar xyz.jar I get error : NoClassDef found : 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.stepDefinations.RunCukesTest
    它给了我错误:Typecumber.api.junit.Cucumber不存在

    It still didnt work , So I appended the RunCukesTest file namespace at the last,
    1.3 java -cp xyz.jar;junit-4.12.jar org.junit.runner.JUnitCore se.stepDefinations.RunCukesTest
    It gave me error :Type cucumber.api.junit.Cucumber not present

    2)因此,我放弃了jar导出选项,现在尝试使用maven Build中的JAR. 我选择了要与Maven Build一起运行的POM,它在目标文件夹

    2) So I gave up on the option for Export of jar and I am trying now to use the JAR from the maven Build. I selected the POM to run with Maven Build and it created 2 jars in the target folder ,

    1个名称为xyz-0.0.1-SNAPSHOT的16kb另一个名称为2nd的
    xyz-0.0.1-SNAPSHOT-jar-with-dependencies具有33mb

    1 with name xyz-0.0.1-SNAPSHOT with 16kb another with 2nd with
    xyz-0.0.1-SNAPSHOT-jar-with-dependencies with 33mb

    1)我使用

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

    它给了我消息:

    没有功能目录的路径

    Got no path to feature directory

    2)因此,我尝试将名称空间附加到RunCukesTest文件中,

    2) So I tried appending the namespace to RunCukesTest file,

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

    我收到错误消息:找不到文件或目录

    I received an error : not a file or directory found

    ,正如错误所指示的那样,它正在尝试在目标文件夹中查找功能.

    , as of course as the error says , it is trying to find a feature inside the target folder.

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

    Again , I want to run the JAR independent of any such project file dependencies in any other computer like an executable.

    任何帮助将不胜感激.谢谢.

    Any help would be appreciated. Thanks.

    推荐答案

    我将您正在考虑的问题分为两部分.

    I would divide the problem you are thinking of in two parts.

    • 创建一个可执行jar
    • 通过您自己的主要方法运行黄瓜

    使用Maven创建可执行jar可以通过不同的方式完成.这里描述了一种实现方法: http://www.thinkcode. se/blog/2011/03/05/create-an-executable-jar-from-maven

    Creating an executable jar using Maven can be done in different ways. One way of doing it is described here: http://www.thinkcode.se/blog/2011/03/05/create-an-executable-jar-from-maven

    这是一个小示例,仅专注于从命令行执行以下操作:

    It is a small example that only focuses on executing something from a command line like this:

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

    java -jar executable-example.jar

    该示例包含所有依赖项.它们都捆绑在同一个罐子里.不需要任何其他的罐子.

    The example contains all dependencies. They are all bundled in the same jar. No need for any additional jars.

    下一步是从main方法执行Cucumber.我的方法是编写一个执行用于命令行版本的Cucumber的Cucumber main方法的main.从命令行运行黄瓜的主要方法位于cucumber-java库中.您可以在cucumber.api.cli.Main

    Next step would be to execute Cucumber from a main method. My approach would be to write a main that executes the Cucumber main method used for the command line version of Cucumber. The main method used to run cucumber from a command line lives in the cucumber-java library. You will find it at cucumber.api.cli.Main

    从另一个主要方法运行一个主要方法是这样的:

    Running a main method from another main method is done like this:

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

    其中的参数是您总是要用来执行Cucumber的命令行参数.

    where arguments are the command line arguments you always want to execute Cucumber with.

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

    Given these two steps, you should be able to execute Cucumber from your own executable jar wherever you are able to execute a jar at all.

    请注意,您正在pom中混合Cucumber的库版本.我将使用所有库的最新版本.比较cucumber-javacucumber-testngcucumber-junit.最新的黄瓜版本是1.2.4.我会用所有的人.

    Notice that you are mixing library version for Cucumber in your pom. I would use the latest version of all libraries. Compare cucumber-java, cucumber-testng and cucumber-junit. The latest Cucumber version is 1.2.4. I would use it for all of them.

    有关从命令行运行Cucumber的更多信息,可以在这里找到:

    More information about running Cucumber from a command line can be found here: https://cucumber.io/docs/cucumber/api/#from-the-command-line

    这篇关于直接从可执行jar运行Cucumber测试的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆