Как добавить новый набор источников в Gradle?

Я хочу добавить тесты интеграции в мою конструкцию Gradle (версия 1.0). Они должны запускаться отдельно от моих обычных тестов, потому что они требуют, чтобы webapp был развернут на localhost (они тестируют этот webapp). Тесты должны иметь возможность использовать классы, определенные в моем основном наборе источников. Как это сделать?

Ответ 1

Мне потребовалось некоторое время, чтобы разобраться, и онлайн-ресурсы были невелики. Поэтому я хотел документировать свое решение.

Это простая gradle сборка script, у которой есть источник intTest в дополнение к основным и тестовым исходным наборам:

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
}

Ответ 2

Вот как я достиг этого, не используя 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
}

Протестировано с использованием: Gradle 1.4 и Gradle 1.6

Ответ 3

Подводя итог обеим старым ответам (получите наилучшую и минимальную жизнеспособность обоих миров):

несколько теплых слов:

  • сначала нам нужно определить sourceSet:

    sourceSets {
        integrationTest
    }
    
  • Затем мы расширяем sourceSet из теста, поэтому мы используем тестовый runtimeClasspath (который включает все отрывки из самого теста теста AND) как путь к классам для производного sourceSet

    sourceSets {
        integrationTest {
            compileClasspath += sourceSets.test.runtimeClasspath
            runtimeClasspath += sourceSets.test.runtimeClasspath // ***)
        }
    }
    
    • *** note) каким-то образом это обновление/расширение для sourceSets.integrationTest.runtimeClasspath необходимо, но должно быть неуместным, поскольку runtimeClasspath всегда расширяет output + runtimeSourceSet, не получает его
  • мы определяем выделенную задачу только для запуска интеграционных тестов

    task integrationTest(type: Test) {
    }
    
  • сообщите тестовое задание, в котором должны использоваться тестовые классы и классы, вместо значений по умолчанию из "test" sourceset

    task integrationTest(type: Test) {
        testClassesDir = sourceSets.integrationTest.output.classesDir
        classpath = sourceSets.integrationTest.runtimeClasspath
    }
    
  • (необязательно) автоматический запуск после теста

    integrationTest.dependsOn test
    
  • (необязательно) автоматический запуск с проверкой

    check.dependsOn integrationTest
    
  • (необязательно) добавьте java, ресурсы в sourceSet, чтобы разрешить автоматическое обнаружение и создать эти "частичные" в вашей среде IDE. то есть IntelliJ IDEA будет автоматически создавать каталоги sourceSet java и ресурсы для каждого набора, если он не существует

    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

ссылаясь на:

к сожалению, код примера на github.com/ gradle/gradle/subprojects/docs/src/samples/java/customizedLayout/build. gradle или .../ gradle/.../withIntegrationTests/build.gradle, похоже, не справляется с этим или имеет другое/более сложное/для меня нет четкого решения в любом случае!

Ответ 4

Модуль nebula-facet устраняет шаблон:

apply plugin: 'nebula.facet'
facets {
    integrationTest {
        parentSourceSet = 'test'
    }
}

Для тестов интеграции, даже это сделано для вас, просто примените:

apply plugin: 'nebula.integtest'

Связи портала портала Gradle для каждого из них:

Ответ 5

Вот что работает для меня как 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
}

Начиная с версии 4.0, Gradle теперь использует отдельные каталоги классов для каждого языка в исходном наборе. Поэтому, если ваша сборка script использует sourceSets.integrationTest.output.classesDir, вы увидите следующее предупреждение об отказе.

Gradle теперь использует отдельные выходные каталоги для каждого языка JVM, но эта сборка предполагает единый каталог для всех классов из исходного набора. Это поведение устарело и должно быть удалено в Gradle 5.0

Чтобы избавиться от этого предупреждения, просто переключитесь на sourceSets.integrationTest.output.classesDirs. Для получения дополнительной информации см. Примечания Gradle 4.0.