Хранение и выполнение тестов. У самого не хватает знаний и опыта.

Добрый день. Интересует как люди ставят тесты на рельсы.

С самими тестами проблем нет. Проблема с их запуском. Пока я запускал их с локальной машины все было просто, но как только пришли девопсы все изменилось. Теперь необходимо дать ребятам jar’ник (или jar’ники), которые они будут запускать командой, которой я скажу и запускать мои тесты автоматически.

Я попытался сделать …
Потратив время в гугле я нашел несколько способов и наиболее разумным мне показался следующий:

Весь код в одной репе (фреймворк + тесты). Эта репа собирается в два джарника. В первый входят все классы (с зависимостями), а во второй только тесты (test-classes). Собирается все мавеном при использовании maven-assembly-plugin и maven-jar-plugin. Получается два джарника. Так же в интернете было найдено прямо то, что нужно.

В конечном итоге набрав в консоле:

java -classpath "qa-1.0-SNAPSHOT-jar-with-dependencies.jar" org.testng.TestNG -testjar qa-1.0-SNAPSHOT-tests.jar -xmlpathinjar resources/testng.xml

Увидел картину:

[TestNG] [ERROR] 
Cannot find class in classpath: com.qa.tests.back.SmokeTest
Exception in thread "main" java.lang.NullPointerException
	at org.testng.TestNG.getStatus(TestNG.java:211)
	at org.testng.TestNG.main(TestNG.java:1324)

Из ошибки кажется, что в клас пасе нет этих файлов. Логично. Добавляем в клас пас еще джарник и тестами:

java -classpath "qa-1.0-SNAPSHOT-jar-with-dependencies.jar;qa-1.0-SNAPSHOT-tests.jar" org.testng.TestNG -testjar qa-1.0-SNAPSHOT-tests.jar -xmlpathinjar resources/testng.xml

Получаю:

Error: Could not find or load main class org.testng.TestNG

Отлично теперь нет даже testng.

После этой точки включился режим паники и я начал пробовать хоть как-то завершить задачу и не придумал ничего лучше, чем засунуть тесты в секцию с сорцами и запускать их программно гонереным testng сьютом. Написав соответствующий манифест собрал один единственный джарник и отдал девопсам. Они рады, а я нет. Как только мне понадобится депенденси на этот проект я буду тянуть ег овместе с тестами. Да и вообще как тольк опридет еще кто-то работать я умру от стыда.

TL;DR
Как бы организовать поставку jsr’ников так, чтоб запустить их можно было на удаленной машине, имея только этот jar’ник и саму джава машину.

Покажите помник джарника тестов. Какие там зависимости?

Я всегда так делаю, если надо просто

  1. Докидываю в помник, в секцию build плагины
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <version>3.1.0</version>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-surefire-plugin</artifactId>
                <version>2.20.1</version>
            </plugin>
        </plugins>
   
  1. А дальше mvn clean test

по моему перепаковывать все вообще стопятьсот зависимостеи внутрь одного jar это слишком хард кор.

можно ведь

java -cp c:\somewhere_dependencies\lib\*;target\runnable-testng-0.1-SNAPSHOT.jar demo.EntryPoint
Пример pom.xml <?xml version="1.0" encoding="UTF-8"?>


4.0.0

<groupId>com.qa</groupId>
<artifactId>tests</artifactId>
<version>1.0-SNAPSHOT</version>

<dependencies>
    <dependency>
        <groupId>org.testng</groupId>
        <artifactId>testng</artifactId>
        <version>6.14.3</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.1.0</version>
            <configuration>
                <archive>
                    <manifest>
                        <mainClass>com.qa.framework.FrameworkInfo</mainClass>
                    </manifest>
                </archive>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
            </configuration>
            <executions>
                <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.1.0</version>
            <executions>
                <execution>
                    <goals>
                        <goal>test-jar</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

Да я так тоже делал, но задача именно в поставке джарника или джарников. Мавена на запускающей машине не будет. Только джава

У меня есть ограничения. Нельзя даже иметь мавеновкий кеш. Только один-два джарник и сама джава.

это конечно больнее но ведь есть с левой резьбой maven-dependency-plugin и maven-assembly-plugin

вот проект кот демонстрирует GitHub - sergueik/testng_runnable: shows how enable single runnable jar with dependencies (at a cost of the size)

а, ну все норм
у вас в джарник не вошли зависимости

а так, запускаете вы верно

остается дело за малым - настроить сборщик, чтобы он вам выдавал один джарник
(пример: https://www.mkyong.com/maven/create-a-fat-jar-file-maven-assembly-plugin/)

Так ведь в случае, когда в класпасе только джарник с депенденси он видит тестнг:

java -classpath "qa-1.0-SNAPSHOT-jar-with-dependencies.jar" org.testng.TestNG -testjar qa-1.0-SNAPSHOT-tests.jar -xmlpathinjar resources/testng.xml

Т.е. он с зависимостями. В примере помника у меня поключены те же плагины. после сборки у меня 3 джарника. Только с классами, полный с депсами и только с тестами.

Попробуем-с.

У меня сейчас так и сделано, что тесты это сорцы, а не тесты

а не проще-ли скоренько переделать на gradle и ранить ./gradlew clean test

Так если была бы возможность иметь билд тул на машине можно было бы и mvn clean test делать. Проблема в том, что там только джава машина и мой джарник разрешены. Не более.

так для ./gradlew не надо иметь установленого в систему Gradle

грейдлу нужны исходники

да это правда - как разложено сейчас surefire тесты не находит

mvn clean test
[WARNING] No processor claimed any of these annotations: org.testng.annotations.
BeforeSuite,org.testng.annotations.BeforeMethod,org.testng.annotations.Test,org.
testng.annotations.AfterSuite,org.testng.annotations.AfterMethod

а если переложтить

mkdir -p src/test/java/demo/
git mv  src/main/java/demo/TestWithData.java src/test/java/demo/

то бутстрап класс не найдет тест класс:

[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.
6.0:compile (default-compile) on project runnable_testng: Compilation failure
[ERROR] /c:/developer/sergueik/testng_runnable/src/main/java/demo/EntryPoint.jav
a:[5,12] cannot find symbol
[ERROR] symbol:   class TestWithData

надо покопаться еще…