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:
- 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)
?. - Se Junit non ha una soluzione magica, c'è un modello di progettazione comune che può aiutarmi qui?
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
Buon punto. Come dici tu, ogni test unitario dovrebbe essere indipendente e non essere statico a nessun livello. – jordiburgos
Ok, lo comprerò. Eliminare il codice significativo dalla suite di test è buono come una soluzione! Grazie! – icyitscold