Me tomó un tiempo darme cuenta y los recursos en línea no eran excelentes. Así que quería documentar mi solución.
Este es un simple script de compilación de Gradle que tiene un conjunto de fuentes intTest además de los conjuntos de fuentes principal y de prueba:
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
}
java/withIntegrationTestsmuestra en la distribución completa de Gradle.Así es como lo logré sin usar
configurations{ }.Probado con: Gradle 1.4 y Gradle 1.6
fuente
java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }no es relevante ya que solo redeclaressrc/<sourceSetName>/...asrc/integrationtest/...: aquí: cambiar la T mayúscula a un menor tcompileClasspath += sourceSets.main.runtimeClasspathestá combinando dos conjuntos de archivos. No existe una resolución de conflictos habitual para las dependencias. Puede terminar con dos versiones de la misma biblioteca. Extender las configuraciones ayudará con eso.Para resumir las dos respuestas anteriores (obtenga la mejor y la mínima viabilidad de ambos mundos):
algunas palabras cálidas primero:
primero, necesitamos definir
sourceSet:a continuación, expandimos el
sourceSetfromtest, por lo tanto usamos eltest.runtimeClasspath(que incluye todas las dependencias detestANDtest) como classpath para el derivadosourceSet:sourceSets.integrationTest.runtimeClasspathes necesaria, pero debería ser irrelevante ya queruntimeClasspathsiempre se expandeoutput + runtimeSourceSet, no la entiendasdefinimos una tarea dedicada solo para ejecutar pruebas de integración:
Configure las
integrationTestclases de prueba y el uso de classpaths. Los valores predeterminados deljavacomplemento utilizan eltestsourceSet(opcional) ejecución automática después de la prueba
(opcional) agregue dependencia de
check(para que siempre se ejecute cuandobuildocheckse ejecuten)(opcional) agregue java, recursos para
sourceSetadmitir la detección automática y cree estos "parciales" en su IDE. es decir, IntelliJ IDEA creará automáticamentesourceSetdirectorios java y recursos para cada conjunto si no existe:tl; dr
refiriéndose a:
Desafortunadamente, 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 / más complejo / para mí no hay una solución más clara de todos modos!
fuente
compileTestJavaclassesDirse migró aclassesDirsen gradle 5El complemento nebula-facet elimina el texto estándar:
Para las pruebas de integración específicamente, incluso esto se hace por usted , solo aplique:
Los enlaces del portal de complementos de Gradle para cada uno son:
fuente
Si estas usando
Para que IntelliJ reconozca el conjunto de fuentes personalizado como raíz de fuentes de prueba:
fuente
Esto es lo que me funciona a partir de Gradle 4.0.
A partir de la versión 4.0, Gradle ahora usa directorios de clases separados para cada idioma en un conjunto de fuentes. Entonces, si su script de compilación usa
sourceSets.integrationTest.output.classesDir, verá la siguiente advertencia de desaprobación.Para deshacerse de esta advertencia, simplemente cambie a
sourceSets.integrationTest.output.classesDirs. Para obtener más información, consulte las notas de la versión de Gradle 4.0 .fuente
Soy nuevo en Gradle y uso Gradle 6.0.1 JUnit 4.12. Esto es lo que se me ocurrió para resolver este problema.
Observe que se hace referencia a la fuente principal y la fuente de prueba por separado, una debajo
mainy otra debajotest.El
testImplementationelemento de abajodependenciessolo se usa para compilar la fuente entest. Si su código principal en realidad tuviera una dependencia de JUnit, también debería especificarimplementationendependencies.Tuve que especificar el
repositoriessección para que esto funcione, dudo que sea la mejor / única forma.fuente