Dadas las respuestas, debe quedar claro que se trata de pruebas locales , no de pruebas instrumentadas . Android / Gradle hace que las cosas sean confusas al llamar a estas pruebas locales "pruebas unitarias".
tir38
Respuestas:
562
Para ejecutar una sola clase de prueba, la respuesta de Airborn es buena.
Con el uso de algunas opciones de línea de comandos, que se encuentran aquí , simplemente puede hacer algo como esto.
gradle test --tests org.gradle.SomeTest.someSpecificFeature
gradle test --tests *SomeTest.someSpecificFeature
gradle test --tests *SomeSpecificTest
gradle test --tests all.in.specific.package*
gradle test --tests *IntegTest
gradle test --tests *IntegTest*ui*
gradle test --tests *IntegTest.singleMethod
gradle someTestTask --tests *UiTest someOtherTestTask --tests *WebTest*ui
Desde la versión 1.10 de gradle admite la selección de pruebas, utilizando un filtro de prueba . Por ejemplo,
apply plugin: 'java'
test {
filter {
//specific test method
includeTestsMatching "org.gradle.SomeTest.someSpecificFeature"
//specific test method, use wildcard for packages
includeTestsMatching "*SomeTest.someSpecificFeature"
//specific test class
includeTestsMatching "org.gradle.SomeTest"
//specific test class, wildcard for packages
includeTestsMatching "*.SomeTest"
//all classes in package, recursively
includeTestsMatching "com.gradle.tooling.*"
//all integration tests, by naming convention
includeTestsMatching "*IntegTest"
//only ui tests from integration tests, by some naming convention
includeTestsMatching "*IntegTest*ui"
}
}
Para entornos de múltiples sabores (un caso de uso común para Android), marque esta respuesta , ya que--tests argumento no será compatible y obtendrá un error.
el enfoque del filtro también podría combinarse con las reglas de la tarea para una selección de prueba conveniente
Matt Whipple
Para conjuntos de pruebas grandes, incluso si se usa --testspara llamar a un único método de prueba dentro de la clase, entonces vemos iteración sobre todas las clases, incluso todas aquellas que no se ejecutan, lo cual es demasiado lento. No sé si esa lentitud se debe a nuestro entorno o si afectaría a otros. Puede actualizar si encuentra más.
arntg
185
Puede hacerlo gradle -Dtest.single=ClassUnderTestTest testsi desea probar una sola clase o usar regexp como gradle -Dtest.single=ClassName*Test testpuede encontrar más ejemplos de clases de filtrado para pruebas en este enlace, sección 23.12. Prueba.
Las versiones recientes (a partir de 1.10 más o menos) admiten una --testsopción de línea de comandos, que se establece para reemplazar -DtestTaskName.single.
Peter Niederwieser
58
Con la --testopción también puede limitar las pruebas a un solo método dentro de su clase de prueba. Por ejemplo: gradle test --tests *MyTest.someMethod ejecutará solo la prueba individual someMethoddentro de su MyTestclase. Cuando estoy construyendo un caso de prueba, normalmente ejecuto un único método a la vez para que sea más fácil enfocarme solo en la salida que necesito para depurar, luego ejecuto todo el caso de prueba al final.
Jeff French
10
También vale la pena señalar que si desea ejecutar una sola prueba en un proyecto de varios módulos, entonces el comando es gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test. Ver esta discusión en gradle.org
Bulat
2
También es posible que desee utilizar una --no-rebuildopción, por ejemplo, gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:testpara evitar que se reconstruyan las dependencias y, a su vez, ejecutar esa única prueba más rápido.
falconepl
2
Sin embargo
Eyal,
108
En caso de que tenga un proyecto de varios módulos:
digamos que la estructura de tu módulo es
root-module
-> a-module
-> b-module
y la prueba (testToRun) que está buscando ejecutar está en el módulo b, con la ruta completa: com.xyz.b.module.TestClass.testToRun
Como aquí está interesado en ejecutar la prueba en b-module, debería ver las tareas disponibles para b-module.
./gradlew :b-module:tasks
El comando anterior enumerará todas las tareas en b-module con una descripción. Y en el caso ideal, tendrá una tarea llamada prueba para ejecutar las pruebas unitarias en ese módulo.
./gradlew :b-module:test
Ahora, ha llegado al punto de ejecutar todas las pruebas en el módulo b, finalmente puede pasar un parámetro a la tarea anterior para ejecutar pruebas que coincidan con el patrón de ruta determinado
./gradlew test --tests "com.xyz.b.module.TestClass.testToRun"
Ejecutará la tarea de prueba tanto para el módulo a como para el b, lo que podría provocar un error ya que no hay nada que coincida con el patrón anterior en un módulo.
Este comando no funciona para mí. > Error: opción de línea de comandos desconocida '--tests'
Tarkik
31
Tenga en cuenta que la --testsopción puede no funcionar si tiene una compilación diferente types/flavors(falla con Unknown command-line option '--tests'). En este caso, es necesario especificar la tarea de prueba en particular (por ejemplo, en testProdReleaseUnitTestlugar de solo test)
¿Puedes elaborar un ejemplo completo? Estoy tratando de ejecutar 3 pruebas que coinciden con un comodín usando ./gradlew test --tests *testMyCollectionTake*y no puedo decir cómo debo reemplazarlo testcon el nombre de la prueba comodín
DanielCuadra
4
A continuación se muestra el comando para ejecutar una sola clase de prueba utilizando la gradlewopción de línea de comando:
En mi caso, las advertencias de mi compilador eclipse java se establecieron demasiado altas, y eclipse no reconocía mi clase como válida para la ejecución. Actualizar la configuración de mi compilador solucionó el problema. Puede leer más sobre esto aquí: anotación-no nulo-no se puede resolver
Respuestas:
Para ejecutar una sola clase de prueba, la respuesta de Airborn es buena.
Con el uso de algunas opciones de línea de comandos, que se encuentran aquí , simplemente puede hacer algo como esto.
Desde la versión 1.10 de gradle admite la selección de pruebas, utilizando un filtro de prueba . Por ejemplo,
Para entornos de múltiples sabores (un caso de uso común para Android), marque esta respuesta , ya que
--tests
argumento no será compatible y obtendrá un error.fuente
--tests
para llamar a un único método de prueba dentro de la clase, entonces vemos iteración sobre todas las clases, incluso todas aquellas que no se ejecutan, lo cual es demasiado lento. No sé si esa lentitud se debe a nuestro entorno o si afectaría a otros. Puede actualizar si encuentra más.Puede hacerlo
gradle -Dtest.single=ClassUnderTestTest test
si desea probar una sola clase o usar regexp comogradle -Dtest.single=ClassName*Test test
puede encontrar más ejemplos de clases de filtrado para pruebas en este enlace, sección 23.12. Prueba.fuente
--tests
opción de línea de comandos, que se establece para reemplazar-DtestTaskName.single
.--test
opción también puede limitar las pruebas a un solo método dentro de su clase de prueba. Por ejemplo:gradle test --tests *MyTest.someMethod
ejecutará solo la prueba individualsomeMethod
dentro de suMyTest
clase. Cuando estoy construyendo un caso de prueba, normalmente ejecuto un único método a la vez para que sea más fácil enfocarme solo en la salida que necesito para depurar, luego ejecuto todo el caso de prueba al final.gradle -D:submodule:test.single=ClassUnderTestTest :submodule:test
. Ver esta discusión en gradle.org--no-rebuild
opción, por ejemplo,gradle -D:submodule:test.single=ClassUnderTestTest --no-rebuild :submodule:test
para evitar que se reconstruyan las dependencias y, a su vez, ejecutar esa única prueba más rápido.En caso de que tenga un proyecto de varios módulos:
digamos que la estructura de tu módulo es
y la prueba (testToRun) que está buscando ejecutar está en el módulo b, con la ruta completa: com.xyz.b.module.TestClass.testToRun
Como aquí está interesado en ejecutar la prueba en b-module, debería ver las tareas disponibles para b-module.
El comando anterior enumerará todas las tareas en b-module con una descripción. Y en el caso ideal, tendrá una tarea llamada prueba para ejecutar las pruebas unitarias en ese módulo.
Ahora, ha llegado al punto de ejecutar todas las pruebas en el módulo b, finalmente puede pasar un parámetro a la tarea anterior para ejecutar pruebas que coincidan con el patrón de ruta determinado
Ahora, en lugar de esto si corres
./gradlew test --tests "com.xyz.b.module.TestClass.testToRun"
Ejecutará la tarea de prueba tanto para el módulo a como para el b, lo que podría provocar un error ya que no hay nada que coincida con el patrón anterior en un módulo.
fuente
./gradlew :b-module:test --tests testToRun
Después de mucho averiguar, lo siguiente funcionó para mí:
gradle test --tests "a.b.c.MyTestFile.mySingleTest"
fuente
Tenga en cuenta que la
--tests
opción puede no funcionar si tiene una compilación diferentetypes/flavors
(falla conUnknown command-line option '--tests'
). En este caso, es necesario especificar la tarea de prueba en particular (por ejemplo, entestProdReleaseUnitTest
lugar de solotest
)fuente
./gradlew test --tests *testMyCollectionTake*
y no puedo decir cómo debo reemplazarlotest
con el nombre de la prueba comodínA continuación se muestra el comando para ejecutar una sola clase de prueba utilizando la
gradlew
opción de línea de comando:Debajo del ejemplo para ejecutar la clase
com.example.TestClass
con varianteVariant_1
:fuente
Debe intentar agregar asteriscos (*) al final.
fuente
Ejecute una sola prueba llamada MyTest:
fuente
En mi caso, las advertencias de mi compilador eclipse java se establecieron demasiado altas, y eclipse no reconocía mi clase como válida para la ejecución. Actualizar la configuración de mi compilador solucionó el problema. Puede leer más sobre esto aquí: anotación-no nulo-no se puede resolver
fuente