Man*_*ger 5 java gradle kotlin spek
我试图将我的测试区分为单元测试和集成测试。我的想法是使用新的JUnit5批注@Tag("unit")
,该批注对我的JUnit测试非常有效,但我无法使其与Spek一起使用。
我现在的课程是:
data class MyObject(val value: Int)
Run Code Online (Sandbox Code Playgroud)
我的测试:
@Tag("unit")
object MyObjectTest {
@Test
fun checkEquality() {
val o1 = MyObject(1)
assertEquals(o1, o1)
}
}
Run Code Online (Sandbox Code Playgroud)
与我的build.gradle具有:
task utest(type: Test) {
outputs.upToDateWhen { false }
useJUnitPlatform {
includeEngines 'junit-jupiter', 'junit-vintage', 'spek'
includeTags 'unit'
excludeTags 'performance', 'integration', 'functional'
}
testLogging {
events "passed", "skipped", "failed"
}
}
Run Code Online (Sandbox Code Playgroud)
当我执行utest时,这可行。但是,使用Spek进行相同操作时:
@Tag("unit")
object MyObjectSpek : Spek({
given("an Object") {
val o1 = MyObject(1)
it("should be equal to itself") {
assertEquals(o1, o1)
}
}
})
Run Code Online (Sandbox Code Playgroud)
发生的是,如果我运行gradle任务utest,它将仅执行的方法,MyObjectTest
而不会执行测试MyObjectSpek
关于如何将Spek与JUnit5标记集成的任何想法,或将单元测试和集成测试分开的另一种想法?
今天我遇到了完全相同的问题。我必须将测试分为 3 个部分:单元、服务(测试 REST API)和集成(WebDriver)。
\n\n免责声明:本指南适用于任何测试框架,而不仅仅是Spek
. Gradle 4.6
或需要更新版本才能运行它。
将测试源集分成源集
\n\n在我的例子中,它们是:
\n\nsrc/test
\xe2\x80\x94 用于单元测试(你已经有了)src/serviceTest
\xe2\x80\x94 用于服务测试src/integrationTest
\xe2\x80\x94 用于集成测试所有这些集都应该具有标准的源集结构。在项目中创建这些文件夹并将包移动到相应的源集。
\n\n完成后添加到以下行build.gradle
之前:dependency section
sourceSets {\n integrationTest {\n compileClasspath += main.output\n runtimeClasspath += main.output\n }\n serviceTest {\n compileClasspath += main.output\n runtimeClasspath += main.output\n }\n}\n\nconfigurations {\n integrationTestCompile.extendsFrom testCompile\n integrationTestRuntime.extendsFrom testRuntime\n\n serviceTestCompile.extendsFrom testCompile\n serviceTestRuntime.extendsFrom testRuntime\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n执行此操作后,您的 IDE(我想您使用 Idea)应该重新索引build.gradle
并识别源集。您的新源集中可能会出现错误,因为它们看不到彼此的源。这是正确的,因为这些源集旨在独立运行,并且不应该成为问题。
单独dependencies
进行适当的配置(可选)
默认情况下serviceTest
,继承integrationTest
所有test
依赖项,但如果您需要将特定于某些配置的内容移出公共范围,您可以在此处执行此操作。
就我而言,WebDriver
它非常重,除了集成测试之外,我不需要它。
dependencies {\n // available for all scopes\n testCompile "org.jetbrains.spek:spek-api:$spekVersion"\n testRuntime "org.jetbrains.spek:spek-junit-platform-engine:$spekVersion"\n testCompile "org.junit.platform:junit-platform-launcher:$junitPlatformVersion"\n\n // compiles only for integrationTest\n integrationTestCompile "org.seleniumhq.selenium:selenium-java:3.11.0"\n integrationTestCompile "org.seleniumhq.selenium.fluent:fluent-selenium:1.19"\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n设置执行顺序
\n\n我们需要添加测试类型的 gradle 任务并进行设置。您可以针对不同的测试任务有不同的设置。
\n\ntask serviceTest(type: Test) {\n // Runs tests from src/serviceTest\n testClassesDirs = sourceSets.serviceTest.output.classesDirs\n classpath = sourceSets.serviceTest.runtimeClasspath\n}\n// Setup serviceTest task \nserviceTest {\n // Uncomment this if you need to skip tests from the set after first failure. Since Gradle 4.6\n //failFast = true\n\n // Enable some logging\n testLogging {\n events "PASSED", "FAILED", "SKIPPED"\n }\n\n // Enable JUnit5 tests\n useJUnitPlatform {\n }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n对集成测试执行相同的操作。
\n\n最后,设置依赖关系和执行顺序:
\n\n// Make service tests run during gradle check\ncheck.dependsOn serviceTest\ncheck.dependsOn integrationTest\n\n// Make service tests run after unit tests\nserviceTest.mustRunAfter test\n// Make integration tests run after service tests\nintegrationTest.mustRunAfter serviceTest\n
Run Code Online (Sandbox Code Playgroud)\n\n结论
\n\n你会得到:
\n\nUnit -> Service -> Integration
严格顺序运行的测试套件链;failFast
选项如何),则其余测试套件将无法运行并浪费资源;gradle <task>
。其他资源:
\n\nbuild.gradle
Spek
归档时间: |
|
查看次数: |
741 次 |
最近记录: |