2011-01-21 12 views
11

Estoy intentando hacer que Gradle ejecute algunas pruebas definidas usando un archivo testng.xml. Mi archivo testng.xml se ve así:¿Cómo puedo decirle a Gradle que use mi archivo testng.xml para Clases de prueba y pedidos?

<!DOCTYPE suite SYSTEM "http://testng.org/testng-1.0.dtd" > 
<suite name="mySuite" verbose="1"> 

    <listeners> 
    <listener class-name="mypackage.MyListener" /> 
    <listener class-name="mypackage.TestOrderer" /> 
    </listeners> 

    <test name="Tests"> 
    <classes> 
     <class name="mytestpackage.CrazyTest1"/> 
     <class name="mytestpackage.CrazyTest2"/> 
     <class name="mytestpackage.CrazyTest3"/> 
    </classes> 
    </test> 
</suite> 

¿Por qué necesito esto? Quiero asegurarme de que mis pruebas estén organizadas de una manera que esté definida por anotaciones similares a las que figuran en el listado here. Como se puede adivinar, TestOrderer es un IMethodInterceptor.

Aquí está el problema, Gradle parece estar tomando control de mi archivo testng.xml y raspando el directorio de prueba para encontrar las pruebas que quiere ejecutar. Incluso si deshabilito esto, no puede ejecutar los métodos de manera apropiada. Esto es lo que creo que debería funcionar, pero simplemente, no.

test { 
    useTestNG() 
    options.suites("src/test/resources/crazyTestNG.xml") 
    # Adding 
    # scanForTestClasses = false 
    # causes zero tests to be executed, since the class names don't end in Test 
} 

Parece que debería ser una obviedad ... bifurcar el proceso TestNG y se deja correr, pero no puedo encontrar la manera de decirle Gradle para salir del camino y sólo hay que ejecutar mi pruebas.

Respuesta

1

El corredor Gradle TestNG asume que si no se especifican clases de prueba, ya sea escaneándolas o haciendo coincidir patrones en el nombre, entonces se debe omitir la ejecución de la prueba por completo.

En su lugar, debe considerar si se ha proporcionado o no un conjunto de aplicaciones xml. ¿Podría agregar un problema jira para este problema?

Una posible solución es utilizar options.listener para especificar los oyentes, y no utilizar un archivo XML suite en todo:

test { 
    options.listeners << 'mypackage.MyListener' 
    options.listeners << 'mypackage.TestOrderer' 
} 

De esta manera no es necesario especificar las clases de prueba, y puede dejar que el escaneado los encuentre por usted.

+0

No, necesito especificar las clases de prueba. Necesito que se ejecuten en un orden muy específico debido a un caso de uso específico del motor TestNG. El escaneo rompe este proceso. –

0

Este método no usa el archivo testng.xml, pero también puede emular los grupos de prueba testNG y ordenar creando grupos de prueba JUnit como tareas de Gradle y luego ordenarlas manualmente ordenando la ejecución de la tarea al ejecutar la compilación:

// in build.gradle 
task testGroupOne(type: Test) { 
    //include '**/*SuiteOne.*' 
    include '**/SuiteOne.class' 
    testReportDir = file("${reportsDir}/SuiteOne") 
    testResultsDir = file("${buildDir}/test-results/SuiteOne") 
} 

task testGroupTwo(type: Test) { 
    //include '**/*SuiteTwo.*' 
    include '**/SuiteTwo.class' 
    testReportDir = file("${reportsDir}/SuiteTwo") 
    testResultsDir = file("${buildDir}/test-results/SuiteTwo") 
} 

a continuación, ejecute su construcción como: Gradle testGroupTwo testGroupOne

6

odiaba el apoyo TestNG en Gradle ... Nos pareció que estaba más nu-flexable comparación con el uso de TestNG prima. Y estaba cansado de jugar con gradle. Mi solución .. Ejecutar TestNG directamente a través de una tarea Gradle

task runTests(type: JavaExec, dependsOn: 'classes') { 
    main = 'org.testng.TestNG' 
    classpath = files("./src/test/resources", 
         project.sourceSets.main.compileClasspath, 
         project.sourceSets.test.compileClasspath, 
         project.sourceSets.main.runtimeClasspath, 
         project.sourceSets.test.runtimeClasspath) 
    args = ["-parallel", "methods", "-threadcount", "1", "-d", "./build/test-output", "./src/test/resources/test.xml"] 
} 

Qué corro desde la línea de comandos:

gradle runTests

6

Así es como se puede configurar un conjunto de pruebas (XML) para ser ejecutado en una tarea de Gradle:

apply plugin: 'java' 

repositories { 
    mavenCentral() 
} 
dependencies { 
    // add the dependencies as needed 
    testCompile group: 'org.testng', name: 'testng', version:'6.8.8' 
    testCompile fileTree('lib') 
} 
test { 
    useTestNG() { 
     // runlist to executed. path is relative to current folder 
     suites 'src/test/resources/runlist/my_test.xml' 
    } 
} 
+0

Más opciones se pueden encontrar [aquí] (https://docs.gradle.org/current/groovydoc/org/gradle/api/tasks/testing/testng/TestNGOptions.html). – Nick

Cuestiones relacionadas