Junit Display Names
Junit: Display Names
Display Names
Las clases de prueba y los métodos de prueba pueden declarar nombres personalizados para mostrar mediante la anotación @DisplayName —con espacios, caracteres especiales e incluso emojis— que se mostrarán en los informes de prueba, así como en los ejecutores de pruebas y en los IDEs.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
@DisplayName("A special test case")
class DisplayNameDemo {
@Test
@DisplayName("Custom test name containing spaces")
void testWithDisplayNameContainingSpaces() {
}
@Test
@DisplayName("╯°□°)╯")
void testWithDisplayNameContainingSpecialCharacters() {
}
@Test
@DisplayName("😱")
void testWithDisplayNameContainingEmoji() {
}
}
Display Name Generators
JUnit Jupiter admite generadores personalizados de display names que pueden configurarse mediante la anotación @DisplayNameGeneration. Los valores proporcionados mediante anotaciones @DisplayName siempre tienen prioridad sobre los nombres generados por un DisplayNameGenerator.
Los generadores pueden crearse implementando la interfaz DisplayNameGenerator. Aquí tienes algunos de los que vienen por defecto en Jupiter:
| DisplayNameGenerator | Behavior |
|---|---|
Standard |
Matches the standard display name generation behavior in place since JUnit Jupiter 5.0 was released. |
Simple |
Removes trailing parentheses for methods with no parameters. |
ReplaceUnderscores |
Replaces underscores with spaces. |
IndicativeSentences |
Generates complete sentences by concatenating the names of the test and the enclosing classes |
Ten en cuenta que, para IndicativeSentences, puedes personalizar el separador y el generador subyacente utilizando la anotación @IndicativeSentencesGeneration, como se muestra en el siguiente ejemplo.
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.DisplayNameGeneration;
import org.junit.jupiter.api.DisplayNameGenerator;
import org.junit.jupiter.api.DisplayNameGenerator.ReplaceUnderscores;
import org.junit.jupiter.api.IndicativeSentencesGeneration;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.ValueSource;
class DisplayNameGeneratorDemo {
@Nested
@DisplayNameGeneration(DisplayNameGenerator.ReplaceUnderscores.class)
class A_year_is_not_supported {
@Test
void if_it_is_zero() {
}
@DisplayName("A negative value for year is not supported by the leap year computation.")
@ParameterizedTest(name = "For example, year {0} is not supported.")
@ValueSource(ints = { -1, -4 })
void if_it_is_negative(int year) {
}
}
@Nested
@IndicativeSentencesGeneration(separator = " -> ", generator = ReplaceUnderscores.class)
class A_year_is_a_leap_year {
@Test
void if_it_is_divisible_by_4_but_not_by_100() {
}
@ParameterizedTest(name = "Year {0} is a leap year.")
@ValueSource(ints = { 2016, 2020, 2048 })
void if_it_is_one_of_the_following_years(int year) {
}
}
}
+-- DisplayNameGeneratorDemo [OK]
+-- A year is not supported [OK]
| +-- A negative value for year is not supported by the leap year computation. [OK]
| | +-- For example, year -1 is not supported. [OK]
| | '-- For example, year -4 is not supported. [OK]
| '-- if it is zero() [OK]
'-- A year is a leap year [OK]
+-- A year is a leap year -> if it is divisible by 4 but not by 100. [OK]
'-- A year is a leap year -> if it is one of the following years. [OK]
+-- Year 2016 is a leap year. [OK]
+-- Year 2020 is a leap year. [OK]
'-- Year 2048 is a leap year. [OK]
Setting the Default Display Name Generator
Puedes usar el parámetro de configuración junit.jupiter.displayname.generator.default para especificar el nombre completo de la clase (fully qualified class name) del DisplayNameGenerator que deseas utilizar por defecto. Al igual que con los generadores de nombres configurados mediante la anotación @DisplayNameGeneration, la clase proporcionada debe implementar la interfaz DisplayNameGenerator.
El generador de nombres por defecto se utilizará para todas las pruebas, a menos que la anotación @DisplayNameGeneration esté presente en una clase de prueba o interfaz de prueba que la contenga. Los valores proporcionados mediante anotaciones @DisplayName siempre tienen prioridad sobre los nombres generados por un DisplayNameGenerator.
Por ejemplo, para usar el generador de nombres ReplaceUnderscores por defecto, debes establecer el parámetro de configuración con el nombre completo de la clase correspondiente (por ejemplo, en src/test/resources/junit-platform.properties):
junit.jupiter.displayname.generator.default = \
org.junit.jupiter.api.DisplayNameGenerator$ReplaceUnderscores
De manera similar, puedes especificar el nombre completo de cualquier clase personalizada que implemente la interfaz DisplayNameGenerator.
En resumen, el nombre para mostrar de una clase o método de prueba se determina según las siguientes reglas de precedencia:
- El valor de la anotación
@DisplayName, si está presente. - Llamando al
DisplayNameGeneratorespecificado en la anotación@DisplayNameGeneration, si está presente. - Llamando al
DisplayNameGeneratorpor defecto configurado mediante el parámetro de configuración, si está presente. - Llamando a
org.junit.jupiter.api.DisplayNameGenerator.Standard.