tutorial the guides español creates compile java gradle build.gradle

java - the - gradle war



¿Cómo ejecutar la prueba de Gradle cuando todas las pruebas están ACTUALIZADAS? (8)

Tengo mi guión de calificación configurado. Cuando ejecuto la compilación de Gradle, todo funciona y ejecuta las pruebas de jUnit.

Después de eso, cuando ejecuto la prueba de Gradle, obtengo lo siguiente:

C:/Users/../../Project>gradle test :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test UP-TO-DATE

Cuando gradle clean , la compilación de Gradle funciona, por supuesto ... Quiero poder restablecer solo las pruebas, no compilar todo el proyecto: ¿cómo debo hacer esto?


Además, tener que agregar --rerun-tasks es realmente redundante. Nunca sucede. Crear un --no-rerun-tasks --rerun-tasks y hacer --rerun-tasks default cuando cleanTask


Aquí hay una solución que utiliza el archivo "build.gradle", en caso de que no desee modificar su línea de comando:

test { dependsOn ''cleanTest'' //Your previous task details (if any) }

Y aquí está la salida. Observe 2 cambios de su salida anterior:

1) Aparece una nueva tarea ''cleanTest'' en la salida.

2) ''test'' siempre se limpia (es decir, nunca ''UP-TO-DATE'') por lo que se ejecuta cada vez:

$ gradle build :compileJava UP-TO-DATE :processResources UP-TO-DATE :classes UP-TO-DATE :findMainClass :jar :bootRepackage :assemble :cleanTest :compileTestJava UP-TO-DATE :processTestResources UP-TO-DATE :testClasses UP-TO-DATE :test :check :build


Creo que esta es una pregunta válida dado que en Gradle es posible ejecutar esta test comando, ¡y lo que sucede es que no sucede nada!

Pero cuestionaría la necesidad de hacer esto, como dijo Jolta en su comentario: si ningún código ha cambiado, ¿por qué necesita volver a realizar la prueba? Si tiene dudas sobre las aportaciones de terceros, diría que debe tener esto en cuenta en el código de su aplicación. Si le preocupa que su código pueda ser "escamoso", es decir, capaz de pasar todas las pruebas la primera vez, pero no una segunda (o la centésima vez), ¿no necesita pensar por qué tiene estas dudas y abordarlas?

Personalmente, creo que este es un error de diseño (muy pequeño) en Gradle: si todo está completamente actualizado, en lugar de ir a "CONSTRUIR CON ÉXITO", debería decir "NO HAY CAMBIO DESDE LA ÚLTIMA CONSTRUCCIÓN EXITOSA: NADA HECHO".


Este fue recientemente el tema en la publicación del blog de Gradle. Deje de volver a ejecutar sus pruebas . El author muestra un ejemplo usando outputs.upToDateWhen { false } y explica por qué está mal:

Esto en realidad no fuerza repeticiones

Lo que probablemente quería decir el autor de este fragmento es "Ejecutar siempre mis pruebas". Sin embargo, eso no es lo que hace este fragmento. Solo marcará la tarea desactualizada, lo que obligará a Gradle a recrear la salida. Pero aquí está la cosa, si la caché de compilación está habilitada, Gradle no necesita ejecutar la tarea para recrear la salida. Encontrará una entrada en el caché y descomprimirá el resultado en el directorio de salida de la prueba.

Lo mismo es cierto para este fragmento:

test.dependsOn cleanTest

Gradle desempaquetará los resultados de la prueba del caché de compilación después de que se haya limpiado la salida, por lo que no se volverá a ejecutar nada. En resumen, estos fragmentos están creando un no-op muy costoso.

Si ahora está pensando "Está bien, también desactivaré el caché", déjenme decirles por qué no deberían hacerlo.

Luego, el autor continúa explicando por qué volver a ejecutar algunas pruebas es una pérdida de tiempo:

La gran mayoría de sus pruebas deberían ser deterministas, es decir, dadas las mismas entradas, deberían producir el mismo resultado.

En los pocos casos en los que desea volver a ejecutar pruebas en las que el código no ha cambiado, debe modelarlas como entrada. Aquí hay dos ejemplos de la publicación del blog que muestran la adición de una entrada para que la tarea la use durante sus comprobaciones actualizadas.

task randomizedTest(type: Test) { systemProperty "random.testing.seed", new Random().nextInt() }

task systemIntegrationTest(type: Test) { inputs.property "integration.date", LocalDate.now() }

Recomiendo leer la publicación completa del blog.


Otra opción sería agregar lo siguiente en su build.gradle:

test.outputs.upToDateWhen {false}


Una opción sería usar el --rerun-tasks en la línea de comando . Esto volvería a ejecutar toda la tarea de prueba y todas las tareas de las que depende.

Si solo está interesado en volver a ejecutar las pruebas, otra opción sería hacer que Gradle limpie los resultados de las pruebas antes de ejecutarlas. Esto se puede hacer usando la tarea cleanTest .

Algunos antecedentes: el complemento de Java define tareas limpias para cada una de las otras tareas. De acuerdo con la documentation :

cleanTaskName : elimina los archivos creados por la tarea especificada. cleanJar eliminará el archivo JAR creado por la tarea jar, y cleanTest eliminará los resultados de la prueba creados por la tarea de prueba.

Por lo tanto, todo lo que necesita para volver a ejecutar sus pruebas es también ejecutar la tarea cleanTest , es decir:
gradle cleanTest test


--rerun-tasks funciona, pero es ineficiente ya que vuelve a ejecutar todas las tareas.

cleanTest por sí solo puede no ser suficiente debido a la caché de compilación.

Entonces, la mejor manera de lograr esto es:

./gradlew --no-build-cache cleanTest test