Ejecute una prueba única desde una clase JUnit usando la línea de comandos

95

Estoy tratando de encontrar un enfoque que me permita ejecutar una sola prueba desde una clase JUnit usando solo la línea de comandos y java.

Puedo ejecutar todo el conjunto de pruebas de la clase usando lo siguiente:

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

Lo que realmente quiero hacer es algo como esto:

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

o:

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

Noté que podría haber formas de hacer esto usando anotaciones JUnit, pero preferiría no modificar la fuente de mis clases de prueba a mano (intentando automatizar esto). También vi que Maven podría tener una forma de hacer esto, pero si es posible, me gustaría evitar depender de Maven.

Entonces me pregunto si hay alguna forma de hacer esto.


Puntos clave que estoy buscando:

  • Capacidad para ejecutar una sola prueba desde una clase de prueba JUnit
  • Línea de comando (usando JUnit)
  • Evite modificar la fuente de prueba
  • Evite el uso de herramientas adicionales
Kevin Jalbert
fuente
4
Genial, otro entusiasta del tipo "Unix es mi IDE". Me gusta usar un IDE para un editor (particularmente con el complemento vim para NetBeans), pero estoy de acuerdo en que las pequeñas herramientas afiladas que duran "para siempre" y se pueden ensamblar en configuraciones arbitrarias, a menudo son mejores que volver a aprender constantemente las características esotéricas de un serie de marcas y versiones IDE. ¡Bien por usted!
Roboprog
2
Dijiste que querías evitar a Maven. Para cualquiera que quiera hacer esto usando maven, vea buscar aquí, maven.apache.org/plugins/maven-surefire-plugin/examples/…
reevesy

Respuestas:

79

Puedes hacer un corredor JUnit barebones personalizado con bastante facilidad. Aquí hay uno que ejecutará un solo método de prueba en el formulario 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);
    }
}

Puedes invocarlo así:

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

Después de un vistazo rápido a la fuente de JUnit, llegué a la misma conclusión que tú de que JUnit no es compatible con esto de forma nativa. Esto nunca ha sido un problema para mí, ya que todos los IDE tienen integraciones personalizadas de JUnit que le permiten ejecutar el método de prueba debajo del cursor, entre otras acciones. Nunca he ejecutado pruebas JUnit directamente desde la línea de comandos; Siempre he dejado que el IDE o la herramienta de compilación (Ant, Maven) se encargue de ello. Especialmente porque el punto de entrada CLI predeterminado (JUnitCore) no produce ningún resultado que no sea un código de salida distinto de cero en los fallos de prueba.

NOTA: para la versión JUnit> = 4.9 necesita la biblioteca hamcrest en classpath

Mark Peters
fuente
2
De hecho, creo recordar haber obtenido un seguimiento de pila completo en el registro cuando fallaba una aserción en una prueba, así como el mensaje (opcional, cuando se define) de cada aserción que describe la expectativa no realizada. Gracias por la solución.
Roboprog
48

Utilizo Maven para construir mi proyecto y uso el complemento SureFire maven para ejecutar pruebas junit. Siempre que tenga esta configuración, puede hacer:

mvn -Dtest=GreatTestClass#testMethod test

En este ejemplo, simplemente ejecutamos un método de prueba llamado "testMethod" dentro de la clase "GreatTestClass".

Para obtener más detalles, consulte http://maven.apache.org/surefire/maven-surefire-plugin/examples/single-test.html

Yiling Lu
fuente
-2

Usamos IntelliJ y pasamos bastante tiempo tratando de resolverlo también.

Básicamente, consta de 2 pasos:

Paso 1: compile la clase de prueba

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

Paso 2: ejecutar la prueba

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

Benjamin Tan Wei Hao
fuente
6
Esto ejecuta todas las pruebas de la clase, no solo una.
Ladrón