2011-10-21 8 views
7

Ho cercato di creare una suite di test personalizzata creando un suiterunner che estenda il runner. Nella suite di test annotata con @RunWith(suiterunner.class) mi riferisco alle classi di test che devono essere eseguite.implementazione junit di più corridori

All'interno della classe di test ho bisogno di ripetere un test particolare, per farlo sto usando la soluzione come menzionato qui: http://codehowtos.blogspot.com/2011/04/run-junit-test-repeatedly.html. ma da quando ho creato un suiterunner che attiva la classe di test e all'interno di quella classe di test che sto implementando @RunWith(ExtendedRunner.class), viene generato un errore di inizializzazione.

Ho bisogno di aiuto per gestire questi 2 corridori e c'è anche un modo per combinare 2 corridori per un test particolare? C'è un altro modo per risolvere questo problema o un modo più semplice per andare avanti?

+0

È possibile fornire un errore completo e uno stacktrace? Dovrebbe funzionare come l'hai descritto. –

risposta

2

Nel caso in cui si utilizzi l'ultima JUnit, è possibile che @Rules sia una soluzione molto più pulita per il problema. Ecco un esempio;

Immagina che questa sia la tua applicazione;

package org.zero.samples.junit; 

/** 
* Hello world! 
* 
*/ 
public class App { 
    public static void main(String[] args) { 
    System.out.println(new App().getMessage()); 
    } 

    String getMessage() { 
    return "Hello, world!"; 
    } 
} 

Questa è la tua classe di test;

package org.zero.samples.junit; 

import static org.junit.Assert.*; 

import org.junit.Rule; 
import org.junit.Test; 

/** 
* Unit test for simple App. 
*/ 
public class AppTest { 

    @Rule 
    public RepeatRule repeatRule = new RepeatRule(3); // Note Rule 

    @Test 
    public void testMessage() { 
    assertEquals("Hello, world!", new App().getMessage()); 
    } 
} 

Creare una classe di regole come;

package org.zero.samples.junit; 

import org.junit.rules.TestRule; 
import org.junit.runner.Description; 
import org.junit.runners.model.Statement; 

public class RepeatRule implements TestRule { 

    private int repeatFor; 

    public RepeatRule(int repeatFor) { 
    this.repeatFor = repeatFor; 
    } 

    public Statement apply(final Statement base, Description description) { 
    return new Statement() { 

     @Override 
     public void evaluate() throws Throwable { 
     for (int i = 0; i < repeatFor; i++) { 
      base.evaluate(); 
     } 
     } 
    }; 
    } 

} 

eseguire il banco di prova come al solito, solo che questa volta i vostri casi di test verrà ripetuto per il dato numero di volte. Potresti trovare casi d'uso interessanti in cui @Rule potrebbe davvero rivelarsi utile. Prova a creare regole composite, gioca intorno a te sicuramente sarà incollato ..

Spero che questo aiuti.