2014-11-14 8 views
5

Sotto JUnit4, ho una suite di test che utilizza un'annotazione @classrule per eseguire il bootstrap di un framework. Questo è necessario per poter costruire determinati oggetti durante i test. Carica anche alcune proprietà dell'applicazione arbitrarie in una statica. Questi sono in genere specifici per la suite di test corrente e devono essere utilizzati da numerosi test in tutta la suite. La mia suite di test sarebbe simile a questa (dove FrameworkResource estende ExternalResource e fa un sacco di lavoro di bootstrap):C'è un buon modo per attivare l'inizializzazione di una suite di test quando si esegue un singolo caso di test?

@RunWith(Suite.class) 
@SuiteClasses({com.example.test.MyTestCase.class}) 
public class MyTestSuite extends BaseTestSuite { 

    @ClassRule 
    public static FrameworkResource resource = new FrameworkResource(); 

    @BeforeClass 
    public static void setup(){ 
     loadProperties("props/suite.properties") 
    } 
} 

I lavori di cui sopra molto bene e la build principale non ha alcun problema l'esecuzione di tutte le suite di test e dei loro rispettivi casi di test (SuiteClasses?). Il problema è quando sono in Eclipse e voglio eseguire un solo caso di test individualmente senza dover eseguire l'intera suite (come parte del processo di sviluppo locale). Fare clic con il pulsante destro del mouse sul file java Esegui come> JUnit Test e qualsiasi test che richiede la risorsa framework o le proprietà di test non funzionerà.

mia domanda è questa:

  1. fa JUnit4 fornire una soluzione per questo problema (senza duplicare il codice di inizializzazione in ogni caso di test)? Un caso di test può dire qualcosa come @dependsOn(MyTestSuite.class)?.
  2. Se Junit non ha una soluzione magica, c'è un modello di progettazione comune che può aiutarmi qui?

risposta

1

Poiché si esegue solo una classe di test, una buona soluzione sarebbe spostare il codice di inizializzazione nella classe di test. Dovresti aggiungere l'annotazione @Before per inizializzare le proprietà.

Ciò richiederebbe la duplicazione del codice su tutte le classi di test. Per risolvere questo problema, è possibile creare una classe genitore astratta con il metodo @Before in modo che tutte le classi figlie abbiano la stessa inizializzazione.

Inoltre, i dati inizializzati potrebbero essere su variabili statiche per verificare se è già inizializzato per quella particolare esecuzione.

+1

Grazie. Usare una classe base astratta per tutti i casi di test è la soluzione con cui ho flirtato, ma non ne sono molto contento. Per i principianti è una discreta quantità (anche se semplice) di refactoring per le mie centinaia di file di test esistenti. Sembra anche sciocco che junit progetta una soluzione che fornisce punti di aggancio a livello di suite senza fornire un modo per classi di test dipendenti per attivare tali hook. Se l'utilizzo di una classe base per i test è la risposta migliore, ciò implica che è una cattiva pratica eseguire un lavoro significativo (di stato) a livello di suite? – icyitscold

+1

Buon punto. Come dici tu, ogni test unitario dovrebbe essere indipendente e non essere statico a nessun livello. – jordiburgos

+0

Ok, lo comprerò. Eliminare il codice significativo dalla suite di test è buono come una soluzione! Grazie! – icyitscold