使用 Gradle 在不同的命令下遵守和构建测试

Complies and Build tests under different commands using Gradle

我正在尝试做一个 POC 来制作一个不同的目录方法来保存单元、集成验收测试等。我看到很多博客,人们在其中创建文件夹以及 main 和 test,但我的意图不是隔离但要合并 test 文件夹本身下的那些。想知道你对这种做法的看法,我不确定这是否有任何陷阱

对于上述情况,我在 spring 启动应用程序的 test 文件夹下创建了三个文件夹,如下所示,用于保存单元测试、集成测试、和验收测试。

我的Gradle配置如下图

sourceSets {
    test {
        java {
            srcDirs += ['src/test/integration/java', 'src/test/unit/java', 'src/test/acceptance/java']
        }
        resources {
            srcDirs += ['src/test/integration/resources', 'src/test/unit/resources', 'src/test/acceptance/resources']
        }
    }
}

以上配置工作正常,唯一的问题是我不知道我们如何使用

遵守和构建文件
./gradle test -----------> builds unit, integration, acceptance tests & generates report 
./gradle unit -----------> builds only unit tests & generates report
./gradle integration ----> builds only integration tests & generates report
./gradle acceptance -----> builds only acceptance tests & generates report

您可以在从原始 test 任务扩展的 build.gradle 中创建新的 gradle 任务,并配置各自的 src 和资源目录。像这样

task unit(type: Test) {
  // your configuration
  include 'org/foo/unit/**'
}

并使 test.DependsOn(unit)test 任务一起执行。

我为两种情况进行了 gradle 配置:隔离测试和综合测试。您可以看到,在合并测试的情况下,配置非常简单,classpath 始终是一个 src/test/java,这种方法为隔离测试提供了对测试位置的相当简单的人类理解配置很复杂,需要微调,如果没有测试名称模式,可能会出现 类 和资源冲突,这种情况对于您将选择哪种类型的写作测试具有重要意义。

这是多测试文件夹的配置:

configurations {
    integrationImplementation.extendsFrom(testImplementation)
    integrationRuntimeOnly.extendsFrom(testRuntimeOnly)

    unitRuntimeOnly.extendsFrom(testRuntimeOnly)
    unitImplementation.extendsFrom(testImplementation)
}

sourceSets {
    integration {
        compileClasspath += sourceSets.main.output
        runtimeClasspath += sourceSets.main.output
        java {
            srcDir file('src/test/integration/java')
        }
        resources {
            srcDir file('src/test/integration/resources')
        }
    }

    unit {
        compileClasspath += sourceSets.main.output
        runtimeClasspath += sourceSets.main.output
        java {
            srcDir file('src/test/unit/java')
        }
        resources {
            srcDir file('src/test/unit/resources')
        }
    }
}

test {
    useJUnitPlatform()

    testClassesDirs += sourceSets.integration.output.classesDirs
    testClassesDirs += sourceSets.unit.output.classesDirs
    classpath += sourceSets.integration.runtimeClasspath
    classpath += sourceSets.unit.runtimeClasspath
    beforeTest { descriptor ->
        logger.lifecycle("Running test: $descriptor")
    }

    testLogging {
        events "PASSED", "FAILED", "SKIPPED"
    }
}

task integration(type: Test) {
    useJUnitPlatform()

    testClassesDirs += sourceSets.integration.output.classesDirs
    classpath += sourceSets.integration.runtimeClasspath
    beforeTest { descriptor ->
        logger.lifecycle("Running test: $descriptor")
    }

    testLogging {
        events "PASSED", "FAILED", "SKIPPED"
    }
}

task unit(type: Test) {
    useJUnitPlatform()

    testClassesDirs = sourceSets.unit.output.classesDirs
    classpath = sourceSets.unit.runtimeClasspath
    beforeTest { descriptor ->
        logger.lifecycle("Running test: $descriptor")
    }

    testLogging {
        events "PASSED", "FAILED", "SKIPPED"
    }
}

如果您有一个文件夹用于所有测试类型,您的配置将是:

task integrationSingleFolder(type: Test) {
    filter {
        includeTestsMatching "*IT"
    }

    useJUnitPlatform()

    testLogging {
        events "PASSED", "FAILED", "SKIPPED"
    }
}

task unitSingleFolder(type: Test) {
    filter {
        includeTestsMatching "*Test"
    }

    useJUnitPlatform()

    testLogging {
        events "PASSED", "FAILED", "SKIPPED"
    }
}