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
gradle test --rerun-tasks
Especifica que cualquier optimización de tarea se ignora.
Fuente: https://gradle.org/docs/current/userguide/gradle_command_line.html