今天我遇到了同样的问题。我不得不将测试分成 3 个部分:单元、服务(测试 REST API)和集成(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"
}
设置执行顺序
我们需要添加 Test 类型的 gradle 任务并进行设置。您可以为不同的测试任务设置不同的设置。
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 {
}
}
对 integrationTest 执行相同的操作。
最后,设置依赖关系和执行顺序:
// 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>
.
其他资源: