2009-07-01 4 views
9

Desidero eseguire alcune registrazioni durante l'esecuzione del test JUnit. In JUnit 3.x è stato sempre facile per ottenere il nome del caso di test attualmente in esecuzione, non importa quanto il banco di prova è stato istanziato:Come ottenere il nome del test case in JUnit 4 in fase di esecuzione?

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

In JUnit 4 cose sembrano essere non così facile. Qualcuno sa una soluzione a questo? C'è qualche opzione per riflettere nell'istanza corrente del Runner?

+3

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

risposta

5

OK. Ho trovato un altro approccio [qualche parte su 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

Sembra esattamente nella direzione che stavo cercando. Ci proverò domani. – mkoeller

+0

Sfortunatamente, questa soluzione verrà rilasciata solo nella prossima versione finale di JUnit 4.7. Nel frattempo sono costretto a restare con una versione precedente inclusa nell'architettura del framework del cliente. Tuttavia, questa è la migliore risposta alla domanda. – mkoeller

+0

Dove si trova questa classe di Interceptors? Non lo vedo nel 4.11 Javadoc –

0

cosa c'è di male:

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

?

+0

In JUnit 4 le classi di test non si estendono più una classe quadro comune. Quindi non esiste più alcun metodo ereditato getName. – mkoeller

+0

OK. Non riesco ancora a capire a cosa serve il 'this.getName(). Com'è diverso da this.getClass(). GetName()? (Ho trovato un'altra risposta per voi) –

+1

In JUnit 3, TestCase.getName() restituisce il nome del metodo di test. Quando si esegue un test case JUnit3, vengono create più istanze della classe di test, ciascuna con un nome diverso. Vedi http://junit.sourceforge.net/doc/cookstour/cookstour.htm – NamshubWriter

10

In JUnit 4.7, è anche possibile ottenere il nome del metodo thest attualmente eseguito Può essere bello quando la registrazione

adottate. da JUnit 4.7 Note di rilascio (leggerli 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

so che questo è vecchio, ma qui è un metodo utile (non JUnit) che ho messo in cima tutti i miei test

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(); 
}