2016-03-17 20 views
7

Sto usando JUnit e Selenium Webdriver. Voglio correre i miei metodi di prova in ordine come come li scrivo nel mio codice, come di seguito:Come eseguire i metodi di prova in ordine con Junit

@Test 
public void registerUserTest(){ 
    // code 
} 

@Test 
public void welcomeNewUserTest(){ 
    // code 
} 

@Test 
public void questionaireNewUserTest(){ 
    // code 
} 

Ma non funziona, viene sempre eseguito i miei metodi di prova in questo ordine:

welcomeNewUserTest() 
registerUserTest() 
questionaireNewUserTest() 

Ho letto una risposta da qualche parte se chiamo il mio metodo con il suffisso Test, quindi JUnit li eseguirò in ordine come li ordino nel codice. Apparentemente, questo non funziona.

Qualsiasi aiuto? Grazie

+3

Se ho compreso correttamente il tuo scenario, questo è un approccio errato ai test - i tuoi test dovrebbero essere indipendenti l'uno dall'altro. –

+0

@DmitryZaitsev: sì, lo so. Poiché scrivo test di accettazione, ed è davvero grande, cerco solo di suddividerlo in piccoli metodi di test. Prova a vedere se Junit potrebbe eseguirli nell'ordine – Ragnarsson

+1

Possibile duplicato di [Come eseguire i metodi di test in ordine specifico in JUnit4?] (Http://stackoverflow.com/questions/3693626/how-to-run-test-methods- in-specifico-order-in-junit4) –

risposta

6

Quindi, per test come questi, in cui i passaggi dipendono l'uno dall'altro, è necessario eseguirli come un'unica unità. Si dovrebbe davvero fare qualcosa di simile:

@Test 
public void registerWelcomeAndQuestionnaireUserTest(){ 
    // code 
    // Register 
    // Welcome 
    // Questionnaire 
} 

Come @Jeremiah cita di seguito, ci sono una manciata di modi unici che separano i test possono eseguire in modo imprevedibile.

Ora che l'ho detto, ecco la soluzione.

Se si desidera test separati, è possibile utilizzare @FixMethodOrder e quindi farlo da NAME_ASCENDING. Questo è l'unico modo che conosco.

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class TestMethodOrder { 

    @Test 
    public void testA() { 
     System.out.println("first"); 
    } 
    @Test 
    public void testC() { 
     System.out.println("third"); 
    } 
    @Test 
    public void testB() { 
     System.out.println("second"); 
    } 
} 

eseguirà:

testA(), testB(), testC()

Nel tuo caso:

@FixMethodOrder(MethodSorters.NAME_ASCENDING) 
public class ThisTestsEverything{ 

    @Test 
    public void T1_registerUser(){ 
     // code 
    } 

    @Test 
    public void T2_welcomeNewUser(){ 
     // code 
    } 

    @Test 
    public void T3_questionaireNewUser(){ 
     // code 
    } 

} 
+1

Grazie. In realtà ho fatto come hai detto tu, eseguirli come una sola unità. Volevo solo sapere se c'è un'opportunità per farlo. E @FixMethodOrder funziona. È come quello che ho cercato. Grazie. Non lo sapevo – Ragnarsson

+0

@LouisT Haha beh, è ​​fantastico che entrambi abbiate cambiato il vostro approccio e che ora abbiate la soluzione se ne avete bisogno. –

+1

Una cosa da ricordare quando si usano le annotazioni degli ordini è che può ancora comportarsi male a seconda di come vengono eseguiti i test. Ad esempio, se si utilizza SureFire, è necessario definire RunOrder in tale configurazione: http://maven.apache.org/surefire/maven-surefire-plugin/test-mojo.html#runOrder Inoltre, se si utilizza un strumento di esecuzione che può introdurre il multithreading nei test (come Maven), i test possono essere eseguiti di nuovo fuori servizio.Non sono sicuro di questo punto, ma vale la pena tenerlo presente se si iniziano a vedere risultati inaspettati. – Jeremiah

3

Non è possibile eseguire i vostri metodi di prova in ordine come il modo in cui sono scritti. Il punto è test deve essere indipendente l'un l'altro. JUnit non incoraggia i test dipendenti.

Ma se siete molto vuoi ...

C'è l'annotazione @FixMethodOrder. Si prega di leggere quanto segue Annotation Type FixMethodOrder

Problemi correlati