Levei um tempo para descobrir e os recursos online não eram bons. Então, eu queria documentar minha solução.
Este é um script de compilação simples do Gradle que tem um conjunto de origem intTest além dos conjuntos de origem principal e de teste:
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/withIntegrationTests
amostra da distribuição completa do Gradle.Aqui está como consegui isso sem usar
configurations{ }
.Testado usando: Gradle 1.4 e Gradle 1.6
fonte
java { srcDir 'src/integrationtest/java' } resources { srcDir 'src/integrationtest/resources' }
não é relevante, uma vez que apenas redeclaressrc/<sourceSetName>/...
parasrc/integrationtest/...
: aqui: mudar o T de capital a um menor tcompileClasspath += sourceSets.main.runtimeClasspath
está combinando dois conjuntos de arquivos. Não há resolução de conflito usual para dependências. Você pode acabar com duas versões da mesma biblioteca. Estender as configurações ajudará nisso.Para resumir as duas respostas antigas (obter o melhor e o mínimo viável de ambos os mundos):
algumas palavras calorosas primeiro:
primeiro, precisamos definir
sourceSet
:em seguida, expandimos o
sourceSet
detest
, portanto, usamos otest.runtimeClasspath
(que inclui todas as dependências do própriotest
ANDtest
) como caminho de classe para o derivadosourceSet
:sourceSets.integrationTest.runtimeClasspath
é necessária, mas deve ser irrelevante, poisruntimeClasspath
sempre expandeoutput + runtimeSourceSet
, não entendadefinimos uma tarefa dedicada apenas para executar testes de integração:
Configure o
integrationTest
uso de classes de teste e caminhos de classe. Os padrões dojava
plugin usam otest
sourceSet
(opcional) execução automática após o teste
(opcional) adicionar dependência de
check
(para que sempre seja executado quandobuild
oucheck
são executados)(opcional) adicione recursos java, ao
sourceSet
para oferecer suporte à detecção automática e criar esses "parciais" em seu IDE. ou seja, o IntelliJ IDEA criará automaticamentesourceSet
diretórios java e recursos para cada conjunto se ele não existir:tl; dr
referindo-se a:
Infelizmente, o código de exemplo em github.com/gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build.gradle ou … / gradle /… / withIntegrationTests / build.gradle parece não lidar com isso ou tem um diferente / mais complexo / para mim nenhuma solução mais clara de qualquer maneira!
fonte
compileTestJava
classesDir
foi migrado paraclassesDirs
no gradle 5O plugin nebula-facet elimina o clichê:
Para testes de integração especificamente, mesmo isso é feito para você , basta aplicar:
Os links do portal do plug-in Gradle para cada um são:
fonte
Se você está usando
Para fazer o IntelliJ reconhecer o conjunto de fontes personalizado como raiz de fontes de teste:
fonte
Aqui está o que funciona para mim a partir do Gradle 4.0.
A partir da versão 4.0, o Gradle agora usa diretórios de classes separados para cada idioma em um conjunto de origem. Portanto, se o seu script de construção usar
sourceSets.integrationTest.output.classesDir
, você verá o seguinte aviso de descontinuação.Para se livrar desse aviso, basta alternar para
sourceSets.integrationTest.output.classesDirs
. Para obter mais informações, consulte as notas de versão do Gradle 4.0 .fonte
Sou novo no Gradle, usando o Gradle 6.0.1 JUnit 4.12. Aqui está o que eu criei para resolver esse problema.
Observe que a fonte principal e a fonte de teste são referenciadas separadamente, uma abaixo
main
e uma abaixotest
.O
testImplementation
item emdependencies
é usado apenas para compilar o código-fonte emtest
. Se o seu código principal realmente dependesse do JUnit, você também especificariaimplementation
sobdependencies
.Tive que especificar a
repositories
seção para fazer isso funcionar, duvido que seja a melhor / única maneira.fonte