Esegui un singolo test da una classe JUnit utilizzando la riga di comando


95

Sto cercando di trovare un approccio che mi permetta di eseguire un singolo test da una classe JUnit utilizzando solo la riga di comando e java.

Posso eseguire l'intera serie di test dalla classe utilizzando quanto segue:

java -cp .... org.junit.runner.JUnitCore org.package.classname

Quello che voglio veramente fare è qualcosa del genere:

java -cp .... org.junit.runner.JUnitCore org.package.classname.method

o:

java -cp .... org.junit.runner.JUnitCore org.package.classname#method

Ho notato che potrebbero esserci modi per farlo usando le annotazioni JUnit, ma preferirei non modificare manualmente l'origine delle mie classi di test (tentando di automatizzarlo). Ho anche visto che Maven potrebbe avere un modo per farlo, ma se possibile vorrei evitare di dipendere da Maven.

Quindi mi chiedo se c'è un modo per farlo?


Punti chiave che sto cercando:

  • Possibilità di eseguire un singolo test da una classe di test JUnit
  • Riga di comando (utilizzando JUnit)
  • Evita di modificare l'origine del test
  • Evita di utilizzare strumenti aggiuntivi

4
Fantastico, un altro appassionato di tipo "Unix è il mio IDE". Mi piace usare un IDE per un editor (in particolare con il plug-in vim per NetBeans), ma sono d'accordo che piccoli strumenti nitidi che durano "per sempre" e possono essere assemblati in configurazioni arbitrarie, sono spesso migliori che riapprendere costantemente le funzionalità esoteriche di un continuo serie di marche e versioni IDE. Buon per te!
Roboprog

2
Hai detto che volevi evitare Maven. Per chiunque voglia farlo usando Maven
reevesy

Risposte:


79

Puoi creare un runner JUnit personalizzato e barebone abbastanza facilmente. Eccone uno che eseguirà un singolo metodo di test nel modulo com.package.TestClass#methodName:

import org.junit.runner.JUnitCore;
import org.junit.runner.Request;
import org.junit.runner.Result;

public class SingleJUnitTestRunner {
    public static void main(String... args) throws ClassNotFoundException {
        String[] classAndMethod = args[0].split("#");
        Request request = Request.method(Class.forName(classAndMethod[0]),
                classAndMethod[1]);

        Result result = new JUnitCore().run(request);
        System.exit(result.wasSuccessful() ? 0 : 1);
    }
}

Puoi invocarlo in questo modo:

> java -cp path/to/testclasses:path/to/junit-4.8.2.jar SingleJUnitTestRunner 
    com.mycompany.product.MyTest#testB

Dopo una rapida occhiata al codice sorgente JUnit, sono giunto alla tua stessa conclusione che JUnit non lo supporta in modo nativo. Questo non è mai stato un problema per me poiché tutti gli IDE hanno integrazioni JUnit personalizzate che consentono di eseguire il metodo di test sotto il cursore, tra le altre azioni. Non ho mai eseguito i test JUnit direttamente dalla riga di comando; Ho sempre lasciato che l'IDE o lo strumento di compilazione (Ant, Maven) se ne occupassero. Soprattutto perché il punto di ingresso CLI predefinito (JUnitCore) non produce alcun output di risultato diverso da un codice di uscita diverso da zero in caso di fallimento del test.

NOTA: per la versione JUnit> = 4.9 è necessaria la libreria hamcrest in classpath


2
In realtà, mi sembra di ricordare di aver ricevuto una traccia completa dello stack nel registro quando un'asserzione in un test ha avuto esito negativo, così come il messaggio (opzionale, quando definito) da ogni asserzione che descrive l'aspettativa non realizzata. Grazie per la soluzione.
Roboprog


-2

Abbiamo usato IntelliJ e abbiamo passato un bel po 'di tempo a cercare di capirlo.

Fondamentalmente, prevede 2 passaggi:

Passaggio 1: compilare la classe di test

% javac -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" SetTest.java

Passaggio 2: eseguire il test

% java -cp .:"/Applications/IntelliJ IDEA 13 CE.app/Contents/lib/*" org.junit.runner.JUnitCore SetTest


6
Questo esegue tutti i test della classe, non solo un test.
Rapinatore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.