Выполнение тестов Cucumber непосредственно из исполняемой банки

У меня есть проект с огурцом и maven, также я использую JUnit.

Я могу успешно запускать и строить свой проект из Eclipse.

Теперь я хочу запустить тест из командной строки в другой системе, которая (не должна) не иметь затмения или огурца. У меня есть идея, что мы можем создать JAR из jar, мы можем запускать тесты с помощью команд java cli.

Ниже приведены комбинации, с которыми я пытаюсь выполнить мои тесты, также я вставляю 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>

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 в путь класса.

Я создаю банки двумя способами,

1) Экспорт JAR с помощью → Project → Export → JAR File  Выбрав MAIN Class на последнем шаге как: RunCukesTest, так как я определил основной метод здесь для точки входа (нужен ли нам этот основной метод в этом классе???)

После экспорта я запускаю команду ниже,

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.stepDefinations.RunCukesTest
 Это дало мне ошибку: Тип cucumber.api.junit.Cucumber не присутствует

2) Итак, я отказался от опции Export of jar, и теперь я пытаюсь использовать JAR из maven Build. Я выбрал POM для работы с Maven Build и создал 2 баночки в целевой папке,

1 с именем xyz-0.0.1-SNAPSHOT с 16kb другим с 2-м с помощью 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 независимо от любых таких зависимостей файлов проекта на любом другом компьютере, таком как исполняемый файл.

Любая помощь будет оценена по достоинству. Спасибо.

Ответ 1

Я бы разделил проблему, о которой вы думаете, на две части.

  • Создать исполняемый файл jar
  • Запустите Cucumber от вашего собственного основного метода

Создание исполняемого фляги с помощью Maven может быть сделано по-разному. Один из способов сделать это описан здесь: http://www.thinkcode.se/blog/2011/03/05/create-an-executable-jar-from-maven.

Это небольшой пример, который фокусируется только на выполнении чего-либо из командной строки, например:

Java -jar исполняемый-пример .jar

Пример содержит все зависимости. Все они упакованы в одну банку. Не нужно никаких дополнительных банок.

Следующим шагом будет выполнение Cucumber из основного метода. Мой подход заключается в написании main, который выполняет основной метод Cucumber, используемый для версии Cucumber для командной строки. Основной метод, используемый для запуска cucumber из командной строки, находится в библиотеке cucumber-java. Вы найдете это в cucumber.api.cli.Main

Запуск метода main из другого метода main выполняется следующим образом:

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

где arguments - это аргументы командной строки, с которыми вы всегда хотите выполнить Cucumber.

Выполнив эти два шага, вы сможете запускать Cucumber из своего собственного исполняемого jar, где бы вы ни выполняли jar.

Обратите внимание, что вы смешиваете версию библиотеки для Cucumber в вашем pom. Я бы использовал последнюю версию всех библиотек. Сравните cucumber-java, cucumber-testng и cucumber-junit. Последняя версия огурца является 1.2.4. Я бы использовал это для всех них.

Дополнительную информацию о запуске Cucumber из командной строки можно найти здесь: https://cucumber.io/docs/cucumber/api/#from-the-command-line

Ответ 2

@SpringBootApplication
public class Application {

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

}