Пакет JAR от проекта LeanFT
У меня есть LeanFT
тестовый набор с TestNG
рамки в IntelliJ IDEA
, Я генерирую файл JAR с mvn install
команда. Я получаю сообщение об ошибке при попытке выполнить его:
Ошибка: не удалось найти или загрузить основной класс test.LeanFTest
LeanFTest
класс присутствует в тестовом именованном пакете и содержит следующие строки:
public class LeanFTest {
public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
TestNG testNG = new TestNG();
testNG.setTestSuites(Arrays.asList("testng.xml"));
testNG.setPreserveOrder(true);
testNG.run();
}
testng.xml
файл:
<suite name="MyTestSuite" verbose="2" parallel="methods" thread-count="1">
<listeners>
<listener class-name="utils.TestNGListener"></listener>
</listeners>
<test name="Regression" parallel="false" >
<classes>
<class name="test.RegressionTest" />
</classes>
</test>
</suite>
Я использую следующие плагины в pom.xml
:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<version>3.0.1</version>
<executions>
<execution>
<id>copy-dependencies</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>${project.build.directory}/lib</outputDirectory>
<overWriteIfNewer>true</overWriteIfNewer>
<overWriteReleases>false</overWriteReleases>
<overWriteSnapshots>true</overWriteSnapshots>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<classpathPrefix>lib/</classpathPrefix>
<mainClass>test.LeanFTest</mainClass>
</manifest>
</archive>
<excludes>
<exclude>log4j2.xml</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<finalName>${project.artifactId}-${project.version}</finalName>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/main/assembly/leanft-assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
leanft-assembly.xml
файл:
<?xml version="1.0"?>
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>fat-tests</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<unpack>true</unpack>
<scope>test</scope>
</dependencySet>
</dependencySets>
<fileSets>
<fileSet>
<directory>${project.build.directory}/test-classes</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.class</include>
</includes>
<useDefaultExcludes>true</useDefaultExcludes>
</fileSet>
</fileSets>
</assembly>
ОБНОВЛЕНИЕ: я проверил файл JAR и обнаружил, что он содержит файлы из /src/main/
папка проекта, но не содержит /src/test/
папка, в которой находятся тестовые классы.
ОБНОВЛЕНИЕ 06.27. Моя структура проекта такая же, как в этом примере проекта: https://github.com/kohli-harshit/leanft-testng-template
2 ответа
LeanFTest class
должен содержать @Test
annotation
а не основной метод Java. TestNG не будет вызывать основной метод Java. Так какой класс (RegressionTest) вы хотите вызвать, убедитесь, что он имеет @Test
аннотация звонить.
Вы можете проверить скрипт, выполнив его с TestNG
Запускать без выполнения из файла.XML.
По умолчанию, когда вы создаете банку, классы, которые находятся под src/test/java
никогда не включаются как часть вашей банки.
Поэтому, когда вы попытаетесь вызвать TestNG через банку, TestNG не сможет найти его явно.
Пожалуйста, посмотрите этот ответ Stackru, чтобы узнать, как создать jar, который также включает в себя тестовые классы.
Когда вы работаете с IDE, TestNG будет иметь видимость для всех классов в src/main/java
а также src/test/java
который объясняет, почему все работает внутри IDE.
Обновление: я обновил ответ со ссылкой на правильный ответ переполнения стека, который решает эту проблему.
Я дублирую соответствующие разделы для вашей справки.
Соответствующий maven-jar-plugin
а также maven-assembly-plugin
описания из файла pom.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>test-jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<archive>
<manifest>
<mainClass>org.testng.TestNG</mainClass>
</manifest>
</archive>
<appendAssemblyId>false</appendAssemblyId>
<descriptors>
<descriptor>src/test/resources/assembly.xml</descriptor>
</descriptors>
</configuration>
</plugin>
Содержание файла src/test/resources/assembly.xml
<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>test-jar-with-dependencies</id>
<formats>
<format>jar</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<dependencySets>
<dependencySet>
<outputDirectory>/</outputDirectory>
<useProjectArtifact>true</useProjectArtifact>
<!-- we're creating the test-jar as an attachement -->
<useProjectAttachments>true</useProjectAttachments>
<unpack>true</unpack>
<scope>test</scope>
</dependencySet>
</dependencySets>
</assembly>
Теперь, когда вы сможете найти свои тестовые классы в созданном банке при запуске mvn clean package
, Здесь мы в основном делаем две вещи:
- С использованием
maven-jar-plugin
мы сначала создаем банку, которая содержит тестовые файлы (вы должны увидеть банку подtarget/*-tests.jar
- С использованием
maven-assembly-plugin
мы сейчас создаем Uber Jar, который включает в себяtest-jar
также как вложение, но включив его после распаковки.