En JUnit 3, podría obtener el nombre de la prueba actualmente en ejecución de esta manera:
public class MyTest extends TestCase
{
public void testSomething()
{
System.out.println("Current test is " + getName());
...
}
}
que imprimiría "La prueba actual es testSomething".
¿Hay alguna forma inmediata o simple de hacer esto en JUnit 4?
Antecedentes: Obviamente, no solo quiero imprimir el nombre de la prueba. Quiero cargar datos específicos de la prueba que se almacenan en un recurso con el mismo nombre que la prueba. Ya sabes, la convención sobre la configuración y todo eso.
java
unit-testing
junit
Dave Ray
fuente
fuente
Respuestas:
JUnit 4.7 agregó esta característica que parece usar TestName-Rule . Parece que esto te dará el nombre del método:
fuente
@Rule
antes@Before
: soy nuevo en JUnit y dependía deTestName
mi@Before
sin ninguna dificultad.JUnit 4.9.xy superior
Desde JUnit 4.9, la
TestWatchman
clase ha quedado en desuso a favor de laTestWatcher
clase, que tiene invocación:Nota: La clase que contiene debe declararse
public
.JUnit 4.7.x - 4.8.x
El siguiente enfoque imprimirá los nombres de los métodos para todas las pruebas en una clase:
fuente
public
campo?JUnit 5 y superior
En JUnit 5 puede inyectar, lo
TestInfo
que simplifica los metadatos de prueba que proporcionan los métodos de prueba. Por ejemplo:Ver más: JUnit 5 Guía del usuario , TestInfo javadoc .
fuente
Intenta esto en su lugar:
El resultado se ve así:
NOTA: ¡Esto NO funciona si su prueba es una subclase de TestCase ! La prueba se ejecuta pero el código @Rule simplemente nunca se ejecuta.
fuente
Considerar el uso de SLF4J (Fachada de registro simple para Java) proporciona algunas mejoras ordenadas usando mensajes parametrizados. La combinación de SLF4J con implementaciones de reglas JUnit 4 puede proporcionar técnicas de registro de clase de prueba más eficientes.
fuente
Una forma complicada es crear su propio Runner subclasificando org.junit.runners.BlockJUnit4ClassRunner.
Entonces puedes hacer algo como esto:
Luego, para cada clase de prueba, deberá agregar una anotación @RunWith (NameAwareRunner.class). Alternativamente, puede poner esa anotación en una superclase de prueba si no desea recordarla cada vez. Esto, por supuesto, limita su selección de corredores, pero eso puede ser aceptable.
Además, puede tomar un poco de kung fu para obtener el nombre de la prueba actual del Runner y en su marco, pero esto al menos le da el nombre.
fuente
JUnit 4 no tiene ningún mecanismo listo para usar para que un caso de prueba obtenga su propio nombre (incluso durante la configuración y el desmontaje).
fuente
fuente
Basado en el comentario anterior y considerando más, creé una extensión de TestWather que puedes usar en tus métodos de prueba JUnit con esto:
La clase auxiliar de prueba es la siguiente:
¡Disfrutar!
fuente
ImportUtilsTest
Recibo un error, parece ser una clase de registrador, ¿tengo más información? Graciasfuente
Te sugiero que desacoples el nombre del método de prueba de tu conjunto de datos de prueba. Modelaría una clase DataLoaderFactory que carga / almacena en caché los conjuntos de datos de prueba de sus recursos, y luego en su caso de prueba puede llamar a algún método de interfaz que devuelve un conjunto de datos de prueba para el caso de prueba. Tener los datos de prueba vinculados al nombre del método de prueba supone que los datos de prueba solo se pueden usar una vez, donde en la mayoría de los casos sugeriría que los mismos datos de prueba se utilicen en múltiples pruebas para verificar varios aspectos de su lógica comercial.
fuente
Puede lograr esto usando
Slf4j
yTestWatcher
fuente
En JUnit 5
TestInfo
actúa como un reemplazo directo para la regla TestName de JUnit 4.De la documentación:
Para recuperar el nombre del método de la prueba ejecutada actual, tiene dos opciones:
String TestInfo.getDisplayName()
yMethod TestInfo.getTestMethod()
.Para recuperar solo el nombre del método de prueba actual
TestInfo.getDisplayName()
puede no ser suficiente ya que el nombre para mostrar predeterminado del método de prueba esmethodName(TypeArg1, TypeArg2, ... TypeArg3)
.Duplicar nombres de métodos
@DisplayName("..")
no es necesariamente una buena idea.Como alternativa, podría usar
TestInfo.getTestMethod()
eso que devuelve unOptional<Method>
objeto.Si el método de recuperación se usa dentro de un método de prueba, ni siquiera necesita probar el
Optional
valor ajustado.fuente
JUnit 5 a través de ExtensionContext
Ventaja:
Puede tener las funcionalidades adicionales de
ExtensionContext
anulandoafterEach(ExtensionContext context)
.fuente