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

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

75 голосов | спросил Spina 20 J000000Friday12 2012, 18:30:47

3 ответа


0

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

ответил Mike Rylander 29 Maypm13 2013, 20:34:43
0

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

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

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

     sourceSets {
        integrationTest
    }
    
  2. затем мы расширяем sourceSet из test, поэтому мы используем test.runtimeClasspath (который включает в себя все зависимости от test И test в качестве пути к классу для производного sourceSet:

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

     task integrationTest(type: Test) {
    }
    
  4. Настройте классы integrationTest и используйте пути к классам. По умолчанию из плагина java используется test sourceSet

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

    интеграция.проверяет по тесту
    
  6. (необязательно) добавьте зависимость от check (поэтому он всегда запускается, когда build или check выполняются)

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

     sourceSets {
         integrationTest {
             java
             resources
         }
    }
    

ТЛ, д-р

 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
}
tasks.integrationTest.dependsOn(tasks.test)

имеется в виду:

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

ответил childno͡.de 17 J0000006Europe/Moscow 2016, 15:49:53
0

Вот что у меня работает с 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 теперь использует отдельные каталоги классов для каждого языка в исходном наборе. Поэтому, если ваш скрипт сборки использует sourceSets.integrationTest.output.classesDir, вы увидите следующее предупреждение об устаревании.

  

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

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

ответил Ryan Sobol 2 PM00000060000003431 2017, 18:31:34

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132