сегодня я столкнулся с точно такой же проблемой. Мне пришлось разделить тесты на 3 раздела: Unit, Service (тестирование REST API) и Integration (WebDriver).
Отказ от ответственности: это руководство применимо для любой среды тестирования, а не только для Spek
. Gradle 4.6
или новее требуется для запуска этого.
Отдельный набор тестовых источников на исходные наборы
В моем примере они будут:
src/test
- для юнит-тестов (у вас уже есть)
src/serviceTest
- для служебных испытаний
src/integrationTest
- для интеграционных испытаний
все эти наборы должны иметь стандартную структуру набора источников. Создайте эти папки внутри вашего проекта и переместите ваши пакеты в соответствующие исходные наборы.
Когда это будет сделано, добавьте к build.gradle
перед dependency section
следующие строки:
sourceSets {
integrationTest {
compileClasspath += main.output
runtimeClasspath += main.output
}
serviceTest {
compileClasspath += main.output
runtimeClasspath += main.output
}
}
configurations {
integrationTestCompile.extendsFrom testCompile
integrationTestRuntime.extendsFrom testRuntime
serviceTestCompile.extendsFrom testCompile
serviceTestRuntime.extendsFrom testRuntime
}
После того, как вы сделаете это, ваша IDE (я полагаю, вы используете Idea) должна переиндексировать build.gradle
и распознать исходные наборы. У вас могут быть ошибки в ваших новых наборах источников, потому что они не видят друг друга источники. Это правильно, потому что эти исходные наборы предназначены для запуска независимо, и не должно быть проблемой.
Отдельный dependencies
для соответствующих конфигураций (Необязательно)
По умолчанию serviceTest
и integrationTest
наследуют все test
зависимости, но если вам нужно переместить что-то определенное для определенной конфигурации из общей области, вы можете сделать это здесь.
В моем случае WebDriver
довольно тяжелый, и он мне не нужен нигде, кроме интеграционного тестирования.
dependencies {
// available for all scopes
testCompile "org.jetbrains.spek:spek-api:$spekVersion"
testRuntime "org.jetbrains.spek:spek-junit-platform-engine:$spekVersion"
testCompile "org.junit.platform:junit-platform-launcher:$junitPlatformVersion"
// compiles only for integrationTest
integrationTestCompile "org.seleniumhq.selenium:selenium-java:3.11.0"
integrationTestCompile "org.seleniumhq.selenium.fluent:fluent-selenium:1.19"
}
Настройка порядка выполнения
Нам нужно будет добавить задание gradle типа Test и настроить его. У вас могут быть разные настройки для разных тестовых заданий.
task serviceTest(type: Test) {
// Runs tests from src/serviceTest
testClassesDirs = sourceSets.serviceTest.output.classesDirs
classpath = sourceSets.serviceTest.runtimeClasspath
}
// Setup serviceTest task
serviceTest {
// Uncomment this if you need to skip tests from the set after first failure. Since Gradle 4.6
//failFast = true
// Enable some logging
testLogging {
events "PASSED", "FAILED", "SKIPPED"
}
// Enable JUnit5 tests
useJUnitPlatform {
}
}
Сделайте то же самое для интеграционного теста.
Наконец, настройте зависимости и порядок выполнения:
// Make service tests run during gradle check
check.dependsOn serviceTest
check.dependsOn integrationTest
// Make service tests run after unit tests
serviceTest.mustRunAfter test
// Make integration tests run after service tests
integrationTest.mustRunAfter serviceTest
Заключение
Вы получите:
- Цепочка из
Unit -> Service -> Integration
тестовых наборов, работающих в строгом порядке;
- Если вы получите сбой теста (независимо от опции
failFast
) в одном наборе тестов, остальные не запустятся и не будут тратить ресурсы;
- Возможность запуска с консоли каждого пакета отдельно при выполнении
gradle <task>
.
Дополнительные ресурсы: