Я хочу добавить тесты интеграции в мою конструкцию Gradle (версия 1.0). Они должны запускаться отдельно от моих обычных тестов, потому что они требуют, чтобы webapp был развернут на localhost (они тестируют этот webapp). Тесты должны иметь возможность использовать классы, определенные в моем основном наборе источников. Как это сделать?
Как добавить новый набор источников в Gradle?
Ответ 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
, не получает его
- *** note) каким-то образом это обновление/расширение для sourceSets.integrationTest.runtimeClasspath необходимо, но должно быть неуместным, поскольку runtimeClasspath всегда расширяет
-
мы определяем выделенную задачу только для запуска интеграционных тестов
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
ссылаясь на:
- gradle глава java 45.7.1. Свойства исходного набора
- gradle глава java 45.7.3. Некоторые исходные примеры
к сожалению, код примера на 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.