2009-07-01 21 views
9

Quiero hacer un poco de registro mientras ejecuto mi prueba JUnit. En 3.x JUnit siempre era fácil de obtener el nombre del caso de prueba actualmente en ejecución, no importa cómo se crea una instancia del caso de prueba:¿Cómo obtener el nombre del caso de prueba en JUnit 4 en tiempo de ejecución?

public void testFoo() throws Exception() { 
    String testName = this.getName(); 
    // [...] do some stuff 
} 

en JUnit 4 cosas parecen no ser tan fácil. ¿Alguien sabe una solución para esto? ¿Hay alguna opción para reflejar en la instancia actual de Runner?

+3

parece similar a: http://stackoverflow.com/questions/473401/get-name-of-currently-executing-test-in-junit-4 –

Respuesta

5

OK. He encontrado otro enfoque [algún lugar de Internet] (http://www.nabble.com/What-happened-to-getName()--td23456371.html):.

@RunWith(Interceptors.class) 
    public class NameTest { 
      @Interceptor public TestName name = new TestName(); 

      @Test public void funnyName() { 
        assertEquals("funnyName", name.getMethodName()); 
      } 
    } 
+0

Eso parece exactamente en la dirección que estaba buscando. Voy a intentarlo mañana. – mkoeller

+0

Lamentablemente, esta solución solo se lanzará en la próxima versión final de JUnit 4.7. Mientras tanto, me veo obligado a seguir con una versión anterior que está incluida en la arquitectura de marco del cliente. Sin embargo, esta es la mejor respuesta a la pregunta. – mkoeller

+0

¿Dónde está esta clase de interceptores? No lo veo en el Javadoc 4.11 –

0

¿Qué pasa con:

@Test 
public void foo() throws Exception() { 
    String testName = this.getName(); 
    // [...] do some stuff 
} 

?

+0

En JUnit 4 las clases de prueba ya no se extienden una clase de marco común. Entonces no hay método heredado getName. – mkoeller

+0

OK. Todavía no entiendo de qué se trata el 'this.getName(). ¿Cómo es diferente de this.getClass(). GetName()? (He encontrado otra respuesta para usted) –

+1

En JUnit 3, TestCase.getName() devuelve el nombre del método de prueba. Cuando ejecuta un caso de prueba JUnit3, se crean varias instancias de su clase de prueba, cada una con un nombre diferente. Ver http://junit.sourceforge.net/doc/cookstour/cookstour.htm – NamshubWriter

10

En JUnit 4.7, también se puede obtener el nombre del método thest actualmente ejecutada puede ser agradable al iniciar sesión

tomada. de JUnit 4.7 Notas de la versión (leerlos here at github):

public class NameRuleTest { 
    @Rule public TestName name = new TestName(); 

    @Test public void testA() { 
     assertEquals("testA", name.getMethodName()); 
    } 

    @Test public void testB() { 
     assertEquals("testB", name.getMethodName()); 
    } 
} 
4
public class FooTest { 
    @Rule 
    final public TestRule traceTestWatcher = new TestWatcher() { 
     @Override 
     protected void starting(Description d) { 
      System.out.println(d); 
     } 
    }; 

    @Test 
    public void testBar() { 
     ... 
    } 

    @Test 
    public void testBaz() { 
     ... 
    } 
} 
0

sé que esto es viejo, pero aquí es un método útil (no junit) que puse en la parte superior de todas mis pruebas

public static void printTestName(){ 
    final StackTraceElement[] ste = new Throwable().getStackTrace(); 
    int buffer = 35 - ste[1].getMethodName().length(); 
    System.out.println("*******************************************************"); 
    System.out.println("*   TEST: " + ste[1].getMethodName() + getBuffer(buffer) + "*"); 
    System.out.println("*******************************************************"); 
} 

private static String getBuffer(int offset){ 
    StringBuilder buffer = new StringBuilder(""); 
    for(int i = 1; i < offset; i++){ 
     buffer.append(" "); 
    } 
    return buffer.toString(); 
} 
Cuestiones relacionadas