对Spek使用JUnit5标签

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标记集成的任何想法,或将单元测试和集成测试分开的另一种想法?

Кла*_*арц 4

今天我遇到了完全相同的问题。我必须将测试分为 3 个部分:单元、服务(测试 REST API)和集成(WebDriver)。

\n\n

免责声明:本指南适用于任何测试框架,而不仅仅是Spek. Gradle 4.6或需要更新版本才能运行它。

\n\n

将测试源集分成源集

\n\n

在我的例子中,它们是:

\n\n
    \n
  • src/test\xe2\x80\x94 用于单元测试(你已经有了)
  • \n
  • src/serviceTest\xe2\x80\x94 用于服务测试
  • \n
  • src/integrationTest\xe2\x80\x94 用于集成测试
  • \n
\n\n

所有这些集都应该具有标准的源集结构。在项目中创建这些文件夹并将包移动到相应的源集。

\n\n

完成后添加到以下行build.gradle之前:dependency section

\n\n
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并识别源集。您的新源集中可能会出现错误,因为它们看不到彼此的源。这是正确的,因为这些源集旨在独立运行,并且不应该成为问题。

\n\n

单独dependencies进行适当的配置(可选)

\n\n

默认情况下serviceTest,继承integrationTest所有test依赖项,但如果您需要将特定于某些配置的内容移出公共范围,您可以在此处执行此操作。

\n\n

就我而言,WebDriver它非常重,除了集成测试之外,我不需要它。

\n\n
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\n
task 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\n
    \n
  1. Unit -> Service -> Integration严格顺序运行的测试套件链;
  2. \n
  3. 如果您在一个测试套件中遇到测试失败(无论failFast选项如何),则其余测试套件将无法运行并浪费资源;
  4. \n
  5. 能够在执行时从控制台单独运行每个套件gradle <task>
  6. \n
\n\n

其他资源:

\n\n\n