2009-09-18 20 views
21

ho la struttura classica per le prove, ho una suite di test di differenti suite come DatabaseTests, Unittests ecc A volte queste suite contiene altre suite come SlowDatabaseTests, FastDatabaseTests eccCome posso eseguire i miei test JUnit in ordine casuale?

Quello che voglio è quello di casuale l'ordine di esecuzione di test quindi mi assicurerò che non siano dipendenti l'uno dall'altro. La randomizzazione dovrebbe essere ad ogni livello, come suite dovrebbe mescolare l'ordine della classe di test, e la classe di test dovrebbe mescolare l'ordine del metodo di prova.

Se è possibile farlo in Eclipse, sarà il migliore.

+7

Randomizzare l'ordine non proverebbe nulla, dal momento che il casuale potrebbe funzionare "per caso". Inoltre, non sarebbe ripetibile e quindi non sarai mai in grado di rintracciare la causa di un errore. – skaffman

+3

Se scrivo il mio ordine di esecuzione in qualche luogo ogni volta che vengono eseguiti i test, sarò in grado di rintracciare la causa. – nimcap

+8

Puoi renderlo ripetibile dando a Random() un seme che è una funzione della data senza tempo. Se si esegue questa operazione, si consiglia vivamente una generazione continua in modo da notare quando i test falliscono. – NamshubWriter

risposta

12

avete una Sortable ma non riesco a vedere come si dovrebbe utilizzare.

È possibile estendere BlockJUnit4ClassRunner e avere computeTestMethods() restituire una copia randomizzata di super.computeTestMethods(). Quindi utilizzare @RunWith per impostarlo come runner da utilizzare.

ad es.

package com.stackoverflow.mlk; 

import java.util.Collections; 

import org.junit.runners.BlockJUnit4ClassRunner; 
import org.junit.runners.model.InitializationError; 

public class RandomBlockJUnit4ClassRunner extends BlockJUnit4ClassRunner { 

    public RandomBlockJUnit4ClassRunner(Class<?> klass) 
      throws InitializationError { 
     super(klass); 
    } 

    protected java.util.List<org.junit.runners.model.FrameworkMethod> computeTestMethods() { 
     java.util.List<org.junit.runners.model.FrameworkMethod> methods = super.computeTestMethods(); 
     Collections.shuffle(methods); 
     return methods; 
    } 

} 

Poi

@RunWith(com.stackoverflow.mlk.RandomBlockJUnit4ClassRunner.class) 
public class RandomOrder { 
    @Test 
    public void one() { 
    } 

    @Test 
    public void two() { 
    } 

    @Test 
    public void three() { 
    } 
} 
+0

buona risposta ma non abbastanza sufficiente Ho bisogno di implementare anche un runner Suite, per randomizzare l'ordine delle classi di test. Inoltre ho molti test e non voglio mettere annotazioni @RunWith in tutti loro. Penso che possa essere gestito nel runner Suite – nimcap

+2

. Ho trovato questo molto utile, e ho creato un piccolo progetto Java che randomizza test e suite. Per ulteriori informazioni, visitare la sua pagina: http://randomjunit.sourceforge.net/ – AngocA

0

farò in modo che non sono dipendenti di vicenda

È necessario assicurarsi che questo è il caso senza fare affidamento su ordine di esecuzione casuale. Cosa ti fa temere che le dipendenze possano esistere?

+0

Posso chiedere perché la gente rispetta la mia risposta? Cosa c'è che non va? –

+5

Stiamo facendo molta attenzione durante la scrittura dei test unitari e rendendoli indipendenti. Ma stiamo anche scrivendo molto attentamente codice di produzione, i bug sembrano essere visibili, non c'è alcuna garanzia che siano indipendenti. PS. Usiamo JUnit non solo per i test unitari ma anche per i test funzionali, quindi a volte lasciano il DB in qualche stato. – nimcap

+5

@lutz Immagino perché hai risposto a un'altra domanda senza rispondere alla domanda dell'OP – akuhn

3

In generale ciò che è necessario è scrivere il proprio runner di test e nella classe di test runner aggregare i metodi ed eseguire a caso ciascun test (assicurarsi di non eseguire un test due volte).

saperne di più sul framework di test e come scrivere il proprio test runner qui: http://www.ddj.com/architect/184415674

+0

Si noti che l'articolo ddj.com descrive il runner di test JUnit3. Se si prova questo, tenere presente che se i test utilizzano TestSetup o se si tenta di eseguire l'installazione e l'eliminazione a livello di suite estendendo TestSuite, l'approccio suggerito qui non funzionerà; il test runner non "vede" TestSuites o TestDecorators. Anche scrivere il tuo runner di test JUnit3 non funzionerà se esegui test da un IDE come Eclipse. – NamshubWriter

4

https://github.com/KentBeck/junit/pull/386 introduce alcuni ordini, ma non RANDOM. Probabilmente non lo vuoi veramente; i test dovrebbero essere eseguiti in modo deterministico. Se è necessario verificare che le diverse permutazioni dei test continuino a passare, testare tutte le permutazioni; oppure, se ciò non fosse abbastanza lento, introdurre un seme "casuale" per mischiare che è determinato da una variabile d'ambiente o simili, in modo da poter riprodurre eventuali errori. http://hg.netbeans.org/main/file/66d9fb12e98f/nbjunit/src/org/netbeans/junit/MethodOrder.java fornisce un esempio di ciò per JUnit 3.

Problemi correlati