[JUnit] JUnit5 Foundation 4: integración de Maven, pruebas parametrizadas, pruebas repetidas [Fin]
Serie anterior:
- [JUnit] Conceptos básicos de JUnit5 1 - Uso de estructuras y aserciones de JUnit5
- [JUnit] Conceptos básicos de JUnit5 2 - Anotaciones de ciclo de vida y anotaciones de DisplayName
- [JUnit] Conceptos básicos de JUnit5 3: inyección de dependencia, asumir, habilitar/deshabilitar pruebas y pruebas anidadas
Integración Maven
Maven es una herramienta de gestión automatizada cuyos principales propósitos son:
- Describir cómo se debe construir (construir) el software
- Describir las dependencias del proyecto (dependencies)
Maven usa archivos XML para la gestión de proyectos y el nombre general del archivo de entrada es pom.xml
.
Antes de que VSCode integre Maven, escribí notas: [VSCode] Configuración de Java JDK/JRE y proyecto de inicialización de Maven , no entraré en detalles aquí.
Dependencias Junit5
Para ejecutar Junit5, Maven debe configurar al menos las siguientes tres dependencias:
-
junit-jupiter-api
Define la API de Junit
-
junit-jupiter-motor
Caso de prueba para ejecutar Junit
-
maven-surefire-plugin
Solía ejecutar Junit en compilaciones maven
Y, Junit5 requiere JAVA8 o superior para ejecutarse, si desea ser compatible con Junit4, debe usar dependencias adicionales. Es relativamente engorroso configurar uno por uno. Junit también proporciona un agregador : JUnit Jupiter (Aggregator) , que integra otras dependencias requeridas de Junit, que incluyen:
- junit-jupiter-api
- junit-jupiter-params
- junit-jupiter-motor
- junit-bom
Prueba paramétrica
Además de las tres dependencias básicas, las pruebas parametrizadas también requieren la implementación de la dependencia junit-jupiter-params, por lo que se recomienda JUnit Jupiter (Aggregator) .
Pruebas parametrizadas con @ValueSource
@ValueSource
Se le pasará una matriz de matrices @ParameterizedTest
y los tipos de parámetros que acepta incluyen:
- corto
- byte
- En t
- largo
- flotar
- doble
- carbonizarse
- java.lang.String
- java.lang.Class
Supongamos que hay una clase que contiene una función para probar si un número entero es impar o no. El método de prueba se implementa de la siguiente manera:
package com.example;
import static org.junit.jupiter.api.Assertions.assertTrue;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
public class OddNumberTest {
@ParameterizedTest
@ValueSource(ints = {
1,3,5,7,10})
@Test
void testOddNumber(int number) {
OddNumber oddNum = new OddNumber();
assertTrue(oddNum.isOdd(number));
}
}
Los resultados son los siguientes:
Como puede ver, todos los casos de prueba con números impares pasan, pero los casos de prueba con números pares fallan.
Pruebas parametrizadas con @EnumSource
@EnumSource
Acepta un conjunto de instancias de enumeración, como:
package com.example;
public enum ChessPiece {
QUEEN,
KING,
KNIGHT,
PAWN,
ROOK,
}
Caso de prueba:
package com.example;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.EnumSource;
public class EnumTest {
@ParameterizedTest
@EnumSource(ChessPiece.class)
void testEnum(ChessPiece piece) {
assertNotNull(piece);
}
}
resultado de la operación:
Personalmente, creo que enum es muy útil para realizar pruebas compatibles con varias bases de datos.
Pruebas parametrizadas con @MethodSource
@MethodSource
Admite el uso de métodos de fábrica para pasar valores. Tenga en cuenta que el método de fábrica debe ser un método estático, como:
package com.example;
import static org.junit.jupiter.api.DynamicTest.stream;
import java.util.stream.Stream;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.MethodSource;
public class MethodTest {
@ParameterizedTest
@MethodSource("paramProvider")
void testMethodSource(String arg) {
System.out.println(arg);
}
static Stream<String> paramProvider() {
return Stream.of("para1", "para2");
}
}
resultado de la operación:
Pruebas parametrizadas con @CsvSource
@CsvSource
Admite pasar un conjunto de pares clave-valor separados por comas, como:
package com.example;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
public class CsvMethod {
@ParameterizedTest
@CsvSource({
"one, 1", "two, 2", "'test, test', 10"})
void testCsvSource(String first, int second) {
System.out.println(first + ", " + second);
}
}
Los resultados son los siguientes:
Pruebas parametrizadas con @CsvFileSource
@CsvFileSource
@CsvSource
Casi lo mismo que , excepto que @CsvFileSource
acepta la dirección de ruta de un archivo CSV.
Repita la prueba
Muchos proyectos realizarán pruebas de estrés antes de lanzarse, y el método de usar pruebas repetidas en JUnit5 también es muy simple:
package com.example;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.RepeatedTest;
public class RepeatedTestExample {
@RepeatedTest(name = "{displayName} - {currentRepetition}/{totalRepetitions}",
value = 5)
@DisplayName("Repeated Test")
public void simpleRepeatedTest() {
System.out.println("hello world");
}
}
resultado de la operación:
Tenga en cuenta que la palabra clave displayName
, currentRepetition
, totalRepetitions
se puede utilizar para identificar fácilmente la prueba que se está ejecutando actualmente.