Ejecute un método de prueba único con maven

519

Sé que puedes ejecutar todas las pruebas en una clase determinada usando:

mvn test -Dtest=classname

Pero quiero ejecutar un método individual y -Dtest = classname.methodname no parece funcionar.

BillMan
fuente
3
Me interesaría saber cómo hacer esto también. Sin embargo, si me encuentro haciéndolo con bastante frecuencia, creo que esa prueba podría ser un candidato para dividirse en su propia clase, por lo que puede usar la mvn test -Dtest=classnamesintaxis.
John Paulett
¿Quieres saber cómo hacerlo solo a través de la línea de comandos? ¿O usar un IDE (eclipse) funcionaría para usted?
Diego Dias
1
Estaba mirando una línea de comando. Creo que el complemento Junit Eclipse te permitirá hacer esto.
BillMan
Hice esto para Maven 1. Como recordé, implicó hacer cambios a JUnit, que es responsable de introspectar la clase de prueba.
kdgregory

Respuestas:

698

Para ejecutar un único método de prueba en Maven, debe proporcionar el comando como:

mvn test -Dtest=TestCircle#xyz test

donde TestCirclees el nombre de la clase de prueba y xyzes el método de prueba.

Los caracteres comodín también funcionan; tanto en el nombre del método como en el nombre de la clase.

Si está probando en un proyecto de varios módulos, especifique el módulo en el que se encuentra la prueba -pl <module-name>.

Para las pruebas de integración, use la it.test=...opción en lugar de test=...:

mvn -pl <module-name> -Dit.test=TestCircle#xyz integration-test
Mudit Srivastava
fuente
44
Se corrigió el error "No se ejecutaron pruebas" bajando a Surefire 2.9
qwerty
15
Arreglé "¡No se ejecutaron pruebas!" actualizando a 2.14:
alfonx
54
Si está probando en un proyecto de varios módulos, también debe especificar el módulo en el que se encuentra la prueba -pl <module-name>.
Jon
22
Úselo -DfailIfNoTests=falsepara omitir proyectos sin prueba. No Tests Were Executedsucede cuando intenta ejecutar la prueba desde el proyecto raíz y hay módulos sin pruebas en absoluto.
Cereza
44
Este comando funciona !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" test Tenga en cuenta que "-DTest" comienza con MAYÚSCULAS 'T'.
vikas
25

Hay un problema con surefire 2.12. Esto es lo que me pasa al cambiar el complemento maven-surefire de 2.12 a 2.11:

  1. mvn test -Dtest=DesignRulesTest

    Resultado:
    [ERROR] Error al ejecutar el objetivo org.apache.maven.plugins: maven-surefire-plugin: 2.12 : prueba (prueba predeterminada) en el proyecto pmd: ¡ No se ejecutaron pruebas!

  2. mvn test -Dtest=DesignRulesTest

    Resultado: [INFO] --- maven-surefire-plugin: 2.11 : test (default-test) @ pmd --- ... Ejecutando net.sourceforge.pmd.lang.java.rule.design.DesignRulesTest Tests run: 5 , Fallos: 0, Errores: 0, Saltado: 4, Tiempo transcurrido: 4.009 segundos

Duccio Fabbri
fuente
55
Funciona nuevamente en 2.12.1 o posterior.
yurez
Se corrigió "¡No se ejecutaron pruebas!" actualizando a 2.14
alfonx
Si usa @Category(IntegrationTest.class), use -Dit.test=ClassName, de lo contrario obtendrá No tests were executed!incluso con las últimas versiones de complementos.
uvsmtid
16

Lo que hago con mi TestNG, (lo siento, JUnit no lo admite) es que puedo asignar un grupo a la prueba que quiero ejecutar

@Test(groups="broken")

Y luego simplemente ejecute 'mvn -Dgroups = broken'.

atún
fuente
1
Esta es una buena respuesta. En mi caso, la prueba intentó ejecutarse, pero algunos componentes de Seam no se configuraron correctamente, por lo que parece que esto también se salta una parte del código de configuración.
Chris Williams
1
Correcto. Debe poner grupos = divididos en su @BeforeMethod, o hacer @BeforeMethod (alwaysRun = true)
tunaranch
Avíseme qué es el grupo aquí, ya que recibo un problema de compilación.
Paramesh Korrakuti
14

Ejecución de un conjunto de métodos en una sola clase de prueba Con la versión 2.7.3, puede ejecutar solo n pruebas en una sola clase de prueba.

NOTA: es compatible con junit 4.xy TestNG.

Debe usar la siguiente sintaxis

mvn -Dtest=TestCircle#mytest test

Puedes usar patrones también

mvn -Dtest=TestCircle#test* test

A partir de surefire 2.12.1, puede seleccionar varios métodos (JUnit4X solo en este momento, los parches son bienvenidos)

mvn -Dtest=TestCircle#testOne+testTwo test

Consulte este enlace sobre pruebas individuales

Prasanth Kumar Diddi
fuente
2
En mi caso, tuve que citar dos veces el nombre de la prueba TestClass # como mvn -Dtest = "TestCircle # myTest"
Pratik Khadloya
@PratikKhadloya ¿Alguna idea de cómo funciona para las pruebas dependientes? Digamos que tengo los métodos test1 (), test2 (), test3 () en TestClass y test2 depende de test1. ¿Cómo puedo ejecutar solo test2 ()?
Ziska
3
Creo que si tienes dependencias entre tus pruebas, estás haciendo algo mal. Cada prueba debe ser independiente de otras pruebas. Necesita eliminar el acoplamiento entre ellos.
Pratik Khadloya
11

Puede ejecutar clases y métodos de prueba específicos utilizando la siguiente sintaxis:

  1. paquete completo: mvn test -Dtest = "com.oracle.tests. **"

  2. Todos los métodos en una clase: mvn test -Dtest = CLASS_NAME1

  3. método único de una sola clase: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1

  4. método múltiple de clase múltiple: mvn test -Dtest = CLASS_NAME1 # METHOD_NAME1, CLASS_NAME2 # METHOD_NAME2

Nazmul Hoque Shafin
fuente
9

Este comando funciona !! mvn "-DTest=JoinTeamTestCases#validateJoinTeam" testTenga en cuenta que "-DTest" comienza con MAYÚSCULAS 'T'.

vikas
fuente
44
No no trabajar con éxito seguro 2.18.x; solo ejecuta todas las pruebas.
Janaka Bandara
4

El parámetro de prueba mencionado por tobrien le permite especificar un método usando un # antes del nombre del método. Esto debería funcionar para JUnit y TestNG. Nunca lo he probado, solo léelo en la página del plugin Surefire :

Especifique este parámetro para ejecutar pruebas individuales por nombre de archivo, anulando los parámetros de inclusión / exclusión. Cada patrón que especifique aquí se usará para crear un patrón de inclusión formateado como ** / $ {test} .java, por lo que puede escribir "-Dtest = MyTest" para ejecutar una sola prueba llamada "foo / MyTest.java". Este parámetro anula los parámetros de inclusión / exclusión y el parámetro TestNG suiteXmlFiles. desde 2.7.3 Puede ejecutar un número limitado de métodos en la prueba agregando #myMethod o # my * ethod. Si escribe "-Dtest = MyTest # myMethod" compatible con junit 4.xy testNg

Wesley Hartford
fuente
3

Las nuevas versiones de JUnit contienen el corredor de Categorías: http://kentbeck.github.com/junit/doc/ReleaseNotes4.8.html

Pero el procedimiento de lanzamiento de JUnit no está basado en Maven, por lo que los usuarios de Maven deben ponerlo manualmente en sus repositorios.

Andriy Plokhotnyuk
fuente
1
Agradable. Pero no veo cómo esto responde la pregunta.
Pascal Thivent
2
Subj es compatible con la versión 2.7.3 de maven-surefire-plugin: maven.apache.org/plugins/maven-surefire-plugin/examples/…
Andriy Plokhotnyuk
3

A partir de la versión 2.22.1 del plugin surefire (posiblemente anterior), puede ejecutar una sola prueba usando la propiedad testnames cuando use testng.xml

Dado un siguiente testng.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd">
<suite name="Suite">
    <test name="all-tests">
        <classes>
            <class name="server.Atest"/>
            <class name="server.Btest"/>
            <class name="server.Ctest"/>
        </classes>
    </test>
    <test name="run-A-test">
        <classes>
            <class name="server.Atest"/>
        </classes>
    </test>
    <test name="run-B-test">
        <classes>
            <class name="server.Btest"/>
        </classes>
    </test>
    <test name="run-C-test">
        <classes>
            <class name="server.Ctest"/>
        </classes>
    </test>
</suite> 

con el pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    [...]
    <properties>
        <selectedTests>all-tests</selectedTests>
    </properties>
    [...]
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-surefire-plugin</artifactId>
            <version>2.22.1</version>
            <configuration>
                <suiteXmlFiles>
                    <file>src/test/resources/testng.xml</file>
                </suiteXmlFiles>
                <properties>
                    <property>
                        <name>testnames</name>
                        <value>${selectedTests}</value>
                    </property>
                </properties>
            </configuration>
        </plugin>
    </plugins>
    [...]
</project>

Desde la línea de comando

mvn clean test -DselectedTests=run-B-test

Lecturas adicionales: plugin Maven surefire usando testng

bsk
fuente
-5

Puede ejecutar una sola clase de prueba, pero no un solo método dentro de una clase de prueba. Utiliza el nombre simple de la clase, no el nombre completo de la clase. Entonces, si tiene una prueba en "org.sonatype.test.MyTest" y esa es la única prueba que desea ejecutar, su línea de comando se vería así:

mvn test -Dtest=MyTest
Tim O'Brien
fuente
Probé la solución descrita en comentarios anteriores en un proyecto de módulo único, por lo que lo que dice este comentario no es cierto.
tonio
55
Puede haber sido cierto en 2009 cuando se respondió originalmente.
flurdy