Quiero agregar pruebas de integración a mi compilación de Gradle (Versión 1.0). Deberían ejecutarse por separado de mis pruebas normales porque requieren que se implemente una aplicación web en localhost (prueban esa aplicación web). Las pruebas deberían poder usar clases definidas en mi fuente principal. ¿Cómo hago que esto suceda?¿Cómo agrego un nuevo conjunto de orígenes a Gradle?
Respuesta
Esto me tomó un tiempo para averiguarlo y los recursos en línea no eran geniales. Así que quería documentar mi solución.
Este es un simple script de construcción Gradle que tiene una fuente intTest establecer, además de las principales fuente de prueba y conjuntos:
apply plugin: "java"
sourceSets {
// Note that just declaring this sourceset creates two configurations.
intTest {
java {
compileClasspath += main.output
runtimeClasspath += main.output
}
}
}
configurations {
intTestCompile.extendsFrom testCompile
intTestRuntime.extendsFrom testRuntime
}
task intTest(type:Test){
description = "Run integration tests (located in src/intTest/...)."
testClassesDir = project.sourceSets.intTest.output.classesDir
classpath = project.sourceSets.intTest.runtimeClasspath
}
Así es como he logrado esto sin usar configurations{ }
.
apply plugin: 'java'
sourceCompatibility = JavaVersion.VERSION_1_6
sourceSets {
integrationTest {
java {
srcDir 'src/integrationtest/java'
}
resources {
srcDir 'src/integrationtest/resources'
}
compileClasspath += sourceSets.main.runtimeClasspath
}
}
task integrationTest(type: Test) {
description = "Runs Integration Tests"
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath += sourceSets.integrationTest.runtimeClasspath
}
Probado usando: Gradle 1.4 y Gradle 1,6
¡Gracias por compartir! Es bueno ver implementaciones alternativas. – Spina
mientras que 'java { 'src/integrationtest/java' SRCDIR } { recursos SRCDIR 'src/integrationtest/recursos' }' no es relevante ya que solo redeclares 'src/
Para resumir ambas viejas respuestas (obtener mejores y más viable mínima de ambos mundos):
algunas palabras cálidas en primer lugar:
primero, necesitamos definir el conjunto de origen:
sourceSets { integrationTest }
siguiente nos expanda el sourceSet de prueba, para ello utilizamos la runtimeClasspath de prueba (que incluye todos los deps de prueba y prueba en sí) como ruta de clases para el sourceSet derivada
sourceSets { integrationTest { compileClasspath += sourceSets.test.runtimeClasspath runtimeClasspath += sourceSets.test.runtimeClasspath // ***) } }
- *** Nota) de alguna manera esto redeclaración/extender para sourceSets.integrationTest.runtimeClasspath que se necesita, pero debe ser irrelevante, ya que siempre se expande runtimeClasspath
output + runtimeSourceSet
, no lo entiendo
- *** Nota) de alguna manera esto redeclaración/extender para sourceSets.integrationTest.runtimeClasspath que se necesita, pero debe ser irrelevante, ya que siempre se expande runtimeClasspath
definimos una tarea específica para la realización de pruebas de integración simplemente
task integrationTest(type: Test) { }
dicen que el trabajo de prueba que las clases de prueba y rutas de clases deben ser utilizados en lugar de los valores predeterminados de sourceset "prueba"
task integrationTest(type: Test) { testClassesDir = sourceSets.integrationTest.output.classesDir classpath = sourceSets.integrationTest.runtimeClasspath }
(opcional) de ejecución auto después prueba
integrationTest.dependsOn test
(opcional) auto run con check
check.dependsOn integrationTest
(opcional) agrega java, recursos al conjunto de origen para permitir la autodetección y crear estos "parciales" en tu IDE. es decirIntelliJ IDEA creará automáticamente directorios sourceSet Java y recursos para cada conjunto si no existe
sourceSets { integrationTest { java resources } }
tl; dr
apply plugin: 'java'
// apply the runtimeClasspath from "test" sourceSet to the new one
// to include any needed assets: test, main, test-dependencies and main-dependencies
sourceSets {
integrationTest {
// not necessary but nice for IDEa's
java
resources
compileClasspath += sourceSets.test.runtimeClasspath
// somehow this redeclaration is needed, but should be irrelevant
// since runtimeClasspath always expands compileClasspath
runtimeClasspath += sourceSets.test.runtimeClasspath
}
}
// define custom test task for running integration tests
task integrationTest(type: Test) {
testClassesDir = sourceSets.integrationTest.output.classesDir
classpath = sourceSets.integrationTest.runtimeClasspath
}
integrationTest.dependsOn test
referirse a:
- gradle java chapter 45.7.1. Source set properties
- gradle java chapter 45.7.3. Some source set examples
por desgracia, el código de ejemplo en github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle o …/gradle/…/withIntegrationTests/build.gradle parece no manejar esto o tiene una solución diferente para mí/más complejo/no más claro de todos modos!
(!) como resultado, el uso único de las mejoras de sourceSet sin configuraciones o resultados da como resultado un error en la idea después de abrir inicialmente una proyecto. la dependencia de compilación (aquí: prueba) para el nuevo "módulo" (aquí: integrationTest) no está disponible en el primer 'compileTestJava' –
El nebula-facet plug-in elimina el texto modelo:
apply plugin: 'nebula.facet'
facets {
integrationTest {
parentSourceSet = 'test'
}
}
Para las pruebas de integración en concreto, incluso this is done for you, aplicar simplemente:
apply plugin: 'nebula.integtest'
Los Gradle enlaces portal plug-in para cada uno son:
Esto es lo que funciona para mí a partir de Gradle 4.0.
sourceSets {
integrationTest {
compileClasspath += sourceSets.test.compileClasspath
runtimeClasspath += sourceSets.test.runtimeClasspath
}
}
task integrationTest(type: Test) {
description = "Runs the integration tests."
group = 'verification'
testClassesDirs = sourceSets.integrationTest.output.classesDirs
classpath = sourceSets.integrationTest.runtimeClasspath
}
A partir de la versión 4.0, Gradle ahora utiliza directorios de clases separados para cada idioma en un conjunto de origen. Entonces, si su script de construcción usa sourceSets.integrationTest.output.classesDir
, verá la siguiente advertencia de desactivación.
Gradle ahora usa directorios de salida separados para cada lenguaje JVM, pero esta compilación presupone un único directorio para todas las clases desde un conjunto de origen. Este comportamiento ha quedado obsoleto y está programado para eliminarse en Gradle 5.0
Para deshacerse de esta advertencia, simplemente cambie a sourceSets.integrationTest.output.classesDirs
. Para obtener más información, consulte el Gradle 4.0 release notes.
- 1. ¿Cómo agrego nuevo video completamente desde JavaScript?
- 2. ¿Cómo agrego un nuevo sitio/nombre_servidor en nginx?
- 3. ¿Cómo agrego fácilmente un nuevo método en Eclipse?
- 4. Cómo agrego un segue a un UIGestureRecognizer
- 5. ¿Cómo agrego registros a DataGridView en VB.Net?
- 6. ¿Cómo construir dinámicamente un nuevo protobuf a partir de un conjunto de descriptores ya definidos?
- 7. Cómo compilar fuentes jar con gradle
- 8. cómo agrego un nuevo contacto completo a WP con el código C#?
- 9. ¿Cómo puedo importar un script de Gradle a otro?
- 10. ¿Cómo agrego un proyecto a CruiseControl.NET?
- 11. ¿Cómo agrego un dispositivo a dispositivos Xcode?
- 12. Cómo agrego propiedades personalizadas a un formulario
- 13. cómo agrego un int a una cadena
- 14. ¿Cómo agrego un tipo MIME a .htaccess?
- 15. ¿Cómo agrego un hash a * args?
- 16. ¿Cómo agrego un evento OnClick a TCustomControl?
- 17. ¿Cómo agrego un modo de edición a jEdit?
- 18. ios: ¿Cómo agrego un nuevo UDID al perfil de aprovisionamiento sin un dispositivo conectado?
- 19. ¿Cómo agrego un wstring?
- 20. ¿Cómo agrego un tipo de documento a un XDocument?
- 21. valores Anexar a un conjunto en Python
- 22. Gradle - Agregar un solo archivo a JAR
- 23. POST request orígenes
- 24. Transformaciones CSS3: ¿Múltiples orígenes?
- 25. Suprimió accidentalmente el código de un archivo Xaml. ¿Cómo agrego el código de nuevo?
- 26. ¿Cómo tener dos orígenes remotos para Git?
- 27. Gradle alterno a mvn install
- 28. Orígenes de datos multiusuario - Spring + Hibernate
- 29. ¿Cómo agrego un separador a un JComboBox en Java?
- 30. ¿Cómo agrego un subrepo a un repositorio existente en mercurial
Aún deberá declarar y configurar una tarea de prueba de integración. En términos de documentación, hay una muestra 'java/withIntegrationTests' en la distribución completa de Gradle. –
Gracias @PeterNiederwieser He corregido mi secuencia de comandos de compilación de muestra. – Spina
Trataba de hacer esto también ... muchas gracias por publicar la solución :) –