Я не могу запустить скрипт testng с помощью maven. Он говорит, что сборка прошла успешно каждый раз, когда я пытаюсь запустить mvn test -Dtest com.example.tests.ScriptTest();
pom.xml
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.6.1</version>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
Тестовый файл
package com.example.tests;
import org.testng.annotations.Test;
public class ScriptTest{
@Test
public void testScript() {
System.out.println(“This is a test script”);
}
}
В .gitlab-ci я пытаюсь запустить тест maven.
image: maven:latest
stages:
- test
test:
stage: test
script:
- mvn test -Dtest=com.example.tests.ScriptTest
artifacts:
paths:
- target/sunfire-reports
Вот обновление, показывающее весь pom-файл.
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.0-SNAPSHOT</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>scanner</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>scanner</name>
<description>Scan System</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.oracle.database.jdbc</groupId>
<artifactId>ojdbc11</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>net.sourceforge.tess4j</groupId>
<artifactId>tess4j</artifactId>
<version>4.5.4</version>
</dependency>
<dependency>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-report-plugin</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.6.1</version>
<exclusions>
<exclusion>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.31</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
<repositories>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<releases>
<enabled>false</enabled>
</releases>
</pluginRepository>
</pluginRepositories>
</project>
Ожидаемый желаемый результат: тест должен выполняться в gitlab ci.
Зависимость от Surefire-Report-plugin не имеет смысла. Почему бы не запустить одиночный тест через IDE? (исключение junit не обязательно, поскольку в TestNG это необязательно)...
Я пытаюсь запустить тест в рамках автоматизации Gitlab, используя .gitlab-ci. Каждый раз, когда я пытаюсь запустить тест, он говорит, что сборка прошла успешно, вообще не запуская тест.
Вы пробовали предложенный ответ?
Чтобы запустить один тестовый метод из тестового класса, команда должна выглядеть следующим образом:
mvn -Dtest=ScriptTest#testScript test
Шаблон:
mvn -Dtest=ClassName#MethodName test
Я попробовал и получил ошибку сбоя сборки. [ОШИБКА] Не удалось выполнить цель org.apache.maven.plugins:maven-surefire-plugin:3.1.2:test (default-test) в проекте scanpro: не было выполнено ни одного теста, соответствующего шаблону «com.example.tests.ScriptTest». ! (Задайте -Dsurefire.failIfNoSpecifiedTests=false, чтобы игнорировать эту ошибку.) -> [Справка 1]
Пожалуйста, опубликуйте весь pom xml как обновленный вопрос.
Итак, вы обновили свой .gitlab-ci
, чтобы он содержал script: - mvn -Dtest=ScriptTest#testScript test
, но в сообщении об ошибке упоминается шаблон com.example.tests.ScriptTest
?
Вам не хватает плагина Maven Surefire в вашем пом...
Я добавил плагин ниже, но все еще сталкиваюсь с ошибкой. <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> </plugin>
@AppleEater - Пожалуйста, проверьте мой ответ. Это должно решить вашу проблему.
Основная причина проблемы заключается в том, что надёжный плагин, который разрешается из файла super pom, сначала находит привязки JUnit5.
Последний родительский файл pom, предоставленный Spring, всегда содержит зависимости JUnit5.
Плагин Surefire работает следующим образом: сканирует путь к классам, чтобы определить, какой из средств запуска тестов присутствует. AFAIK, как только он находит средство запуска тестов (JUnit или TestNG), он прекращает сканирование пути к классам. Поскольку плагин Surefire всегда находит зависимости JUnit5 (через родительский pom-файл Spring), он всегда пытается запустить тестовые примеры JUnit5.
Если вы запустите команду mvn dependency:tree | grep junit
, вы увидите вывод, подобный приведенному ниже, который подтверждает то, что я говорю о зависимостях JUnit5, доступных в пути к классам.
➜ mvn dependency:tree | grep junit
[INFO] | +- org.junit.jupiter:junit-jupiter:jar:5.10.1:test
[INFO] | | +- org.junit.jupiter:junit-jupiter-api:jar:5.10.1:test
[INFO] | | | +- org.junit.platform:junit-platform-commons:jar:1.10.1:test
[INFO] | | +- org.junit.jupiter:junit-jupiter-params:jar:5.10.1:test
[INFO] | | \- org.junit.jupiter:junit-jupiter-engine:jar:5.10.1:test
[INFO] | | \- org.junit.platform:junit-platform-engine:jar:1.10.1:test
[INFO] | +- org.mockito:mockito-junit-jupiter:jar:5.7.0:test
Когда вы запустите команду mvn test -Dtest=com.example.tests.ScriptTest
для запуска теста, вы заметите в своем терминале что-то вроде этого:
[INFO] --- surefire:3.1.2:test (default-test) @ qn_78271590 ---
[INFO] Using auto detected provider org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.514 s
[INFO] Finished at: 2024-04-07T09:19:34+05:30
[INFO] ------------------------------------------------------------------------
Приведенный выше вывод подтверждает, что плагин Surefire по умолчанию использует поставщика (представьте, что это средство для запуска теста JUnit) org.apache.maven.surefire.junitplatform.JUnitPlatformProvider
. Этот провайдер знает ТОЛЬКО, как искать тесты JUnit, и, поскольку он их не находит, в конечном итоге вы ничего не выполняете.
Теперь, чтобы это исправить, вам нужно заставить плагин Surefire всегда использовать поставщика TestNG.
Вы можете сделать это, добавив явную ссылку на плагин Surefire, как показано ниже, в раздел <plugins>
вашего pom-файла.
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<dependencies>
<dependency>
<groupId>org.apache.maven.surefire</groupId>
<artifactId>surefire-testng</artifactId>
<!-- ensure that this version always matches
with the surefire plugin version
to ensure you never face any discrepancies.
Use 'mvn help:effective-pom' to list plugins with
their versions being used in your project.
-->
<version>3.1.2</version>
</dependency>
</dependencies>
</plugin>
Теперь, когда вы снова запустите тест с помощью команды mvn test -Dtest=com.example.tests.ScriptTest
, вы увидите вывод, который выглядит следующим образом:
[INFO] --- surefire:3.1.2:test (default-test) @ scanner ---
[INFO] Using configured provider org.apache.maven.surefire.testng.TestNGProvider
[INFO]
[INFO] -------------------------------------------------------
[INFO] T E S T S
[INFO] -------------------------------------------------------
[INFO] Running com.example.tests.ScriptTest
This is a test script
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0.340 s -- in com.example.tests.ScriptTest
[INFO]
[INFO] Results:
[INFO]
[INFO] Tests run: 1, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 1.838 s
[INFO] Finished at: 2024-04-07T09:24:55+05:30
[INFO] ------------------------------------------------------------------------
Обратите внимание, как плагин Surefire теперь использует провайдер TestNG для запуска тестов из строки Using configured provider org.apache.maven.surefire.testng.TestNGProvider
в приведенном выше выводе.
Какую именно командную строку вы используете, какой вывод получаете и чего ожидаете?