Je rencontre un problème avec le test d'intégration suivant
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.TestMethodOrder;
import org.junit.jupiter.api.MethodOrderer.OrderAnnotation;
@SpringBootTest
@ActiveProfiles("test")
@TestMethodOrder(OrderAnnotation.classs)
public class FooServiceIT {
@Test
@Order(1)
void testUploadSuccess() { ... }
@Test
@Order(2)
void testDownloadSuccess() { ... }
@Test
@Order(3)
void testDeleteSuccess() { ... }
}
Je m'attends à ce que lorsque j'exécute le test, l'ordre d'exécution serait 1, 2, 3, mais pour une raison quelconque, l'ordre d'exécution réel est 2, 3, 1.
Tbh, je ne sais pas pourquoi l'annotation ne fonctionne pas. J'utilise Spring Boot 2.1.3 avec JUnit 5.4.
Vous devez configurer correctement votre IDE.
Exigences
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
</dependency>
N'utilisez pas JUnit 5 qui offre votre IDE. Si vous l'ajoutez en tant que bibliothèque, vous obtiendrez:
No tests found for with test runner 'JUnit 5'
==================== and this exception ===================
TestEngine with ID 'junit-vintage' failed to discover tests
Java.lang.SecurityException: class "org.junit.jupiter.api.TestMethodOrder"'s signer information does not match signer information of other classes in the same package
N'incluez donc que les dépendances mentionnées et votre code fonctionnera comme prévu:
import org.junit.jupiter.api.MethodOrderer;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.TestMethodOrder;
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class FooServiceIT {
@Test
@Order(1)
public void testUploadSuccess() {
System.out.println("1");
}
@Test
@Order(2)
public void testDownloadSuccess() {
System.out.println("2");
}
@Test
@Order(3)
public void testDeleteSuccess() {
System.out.println("3");
}
}
Résultat JUnit:
1
2
3
Après avoir appliqué tous les paramètres en fonction de la solution recommandée précédente. J'ai toujours la même exécution inverse ou aléatoire @ order.
Pom.xml
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.3.RELEASE</version>
</parent>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>5.4.0</version>
<scope>test</scope>
</dependency>
Arbre de dépendance Maven:
mvn dependency:tree -Dverbose -Dincludes=org.junit.jupiter:junit-jupiter-engine
[INFO] com.personalitytest.demo:personalitytest:jar:1.0-SNAPSHOT
[INFO] \- org.junit.jupiter:junit-jupiter-engine:jar:5.4.0:test
Test JUnit:
@SpringBootTest
@ActiveProfiles("test")
@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class JUnitOrderTest {
private static final Logger log = LoggerFactory.getLogger(JUnitOrderTest.class);
@Test
@Order(1)
public void testUploadSuccess() {
log.info("Junit - Order 1");
}
@Test
@Order(2)
public void testDownloadSuccess() {
log.info("Junit - Order 2");
}
@Test
@Order(3)
public void testDeleteSuccess() {
log.info("Junit - Order 3");
}
}
Sortie:
Running com.personalitytest.demo.security.JUnitOrderTest
08:48:35.470 [main] INFO com.personalitytest.demo.security.JUnitOrderTest - Junit - Order 2
08:48:35.480 [main] INFO com.personalitytest.demo.security.JUnitOrderTest - Junit - Order 3
08:48:35.481 [main] INFO com.personalitytest.demo.security.JUnitOrderTest - Junit - Order 1
vous devez configurer correctement votre pom.xml. Voir le mien:
<properties>
<!-- Dependency versions -->
<junit.jupiter.version>5.6.0</junit.jupiter.version>
<maven-surefire-plugin.version>3.0.0-M4</maven-surefire-plugin.version>
<!-- Java 10 -->
<maven.compiler.source>1.10</maven.compiler.source>
<maven.compiler.target>1.10</maven.compiler.target>
<!-- Encoding -->
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
</properties>
<!-- Jupiter API for writing tests -->
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<version>${junit.jupiter.version}</version>
<scope>test</scope>
</dependency>
</dependencies>
<!-- Maven Surefire plugin to run tests -->
<build>
<plugins>
<!-- plugin to run test cases from maven -->
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven-surefire-plugin.version}</version>
</plugin>
<!-- Maven plugin to use perticular Java version to compile code -->
<plugin>
<groupId>org.Apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
</configuration>
</plugin>
</plugins>
</build>
Maintenant, vos annotations Junit 5 doivent fonctionner correctement
Par exemple, en utilisant Spring Boot, vous pouvez utiliser @ FixMethodOrder (MethodSorters.JVM) au lieu de @ TestMethodOrder (MethodOrderer.OrderAnnotation.class). Tous les tests sont exécutés dans l'ordre où ils apparaissent.
@FixMethodOrder(MethodSorters.JVM)
public class MyTest{
@Test
public void zzzz(){}
@Test
public void cccc(){}
@Test
public void aaaa(){}
@Test
public void bbbb(){}
}
L'exécution de l'ordre est:
zzzz()
cccc()
aaaa()
bbbb()