0

我正在将测试转移到将与 Gradle 一起运行的 junit5。在我使用的一个项目中,有单元测试和一些必须按需运行的特定测试(我想来自特定的 Gradle 任务)。

单元测试很清楚。Gradle 插件添加了对此的支持。但是我找不到一种方法来为我的需要定义另一个测试任务,我在 Junit5 插件源中搜索并发现没有任何特定的类用于该目的。Gradle 插件只是设置一个 JavaExec 任务然后运行它。

因此,似乎没有可见的方法来定义我自己的内置类型任务

task myTask(type: Junit5TestRunner) 这里我们设置一个任务

有什么想法可以做到吗?

4

2 回答 2

2

定义一个新配置,依赖于junit-platform-console-standalone工件并根据您的需要配置控制台启动器。喜欢:

configurations {
    standalone
}

dependencies {
    standalone 'org.junit.platform:junit-platform-console-standalone:1.0.0-SNAPSHOT'
}

task downloadJUnitPlatformStandalone(type: Copy) {
    from configurations.standalone
    into "$buildDir/junit-platform-standalone"
    eachFile { println " (standalone) -> " + it.file.name }
}

task runJUnitPlatformStandalone(type: JavaExec, dependsOn: downloadJUnitPlatformStandalone) {
    jvmArgs '-ea'
    jvmArgs '-Djava.util.logging.config.file=src/test/logging.properties'
    classpath = fileTree(dir: "$buildDir/junit-platform-standalone", include: '*.jar') + project.sourceSets.test.runtimeClasspath
    main 'org.junit.platform.console.ConsoleLauncher'
    args += '--scan-class-path'
    args += '--disable-ansi-colors'
    args += '--details=tree'
    args += "--reports-dir=$project.testReportDir"
}

test.dependsOn runJUnitPlatformStandalone

junit-platform-standalone.gradle或备用(仅限 Jupiter)依赖项 jupiter.gradle

无需自己配置和下载:https ://discuss.gradle.org/t/junit-5-jupiter-platform-snapshot-console-launcher-task/19773/2

于 2017-04-20T07:06:06.007 回答
0

似乎我为该任务找到了更好的决定

task myTask(type: Junit5TestRunner) 这里我们设置一个任务

Sormuras 的回答无疑给了我一个正确的方向解决方案是将大多数样板代码移动到单独的任务类中,然后从脚本中使用该任务,从而使其更具可重用性。

班上

/**
 *
 * Created by Vladimir Bogodkhov on 21/04/17.
 * @author Vladimir Bogodkhov
 */
class SQJUnit5 extends JavaExec {

    enum Details {

        /**
         * No test plan execution details are printed.
         */
        none("none"),

        /**
         * Test plan execution details are rendered in a flat, line-by-line mode.
         */
                flat("flat"),

        /**
         * Test plan execution details are rendered as a simple tree.
         */
                tree("tree"),

        /**
         * Combines tree flat modes.
         */
                verbose("verbose");

        Details(String id) {
            this.id = Objects.requireNonNull(id);
        }

        final String id

    }


    List<String> includeTags
    List<String> excludeTags
    List<String> includeTests = ['^.*Tests?$']
    List<String> excludeTests
    File reportsdir
    Details details = Details.none;
    List<String> scanclasspath


    SQJUnit5() {
        jvmArgs '-ea'
        main 'org.junit.platform.console.ConsoleLauncher'
        args += '--disable-ansi-colors'
        args += '--details=tree'
        args += '--details-theme=unicode'
    }

    @Override
    void exec() {
        prepare()
        super.exec()
    }

    private void prepare() {
        if (includeTags) includeTags.each { args += ['--include-tag', it] }
        if (excludeTags) excludeTags.each { args += ['--exclude-tag', it] }
        if (includeTests) includeTests.each { args += ['--include-classname', it] }
        if (excludeTests) excludeTests.each { args += ['--exclude-classname', it] }
        if (reportsdir) {
            if (reportsdir.exists() && !reportsdir.isDirectory()) {
                throw new IllegalStateException("reportsdir must be a directory. $reportsdir.absolutePath")
            }
            args += ['--reports-dir', reportsdir.absolutePath]
        }

        if (!scanclasspath) {
            args += ['--scan-class-path']
        } else {
            scanclasspath.each { args += ['--scan-class-path', it] }
        }
    }
}

脚本片段

task particularTests(type: SQJUnit5, dependsOn: build) {
    classpath = project.sourceSets.test.runtimeClasspath + fileTree(dir: '../../libs/junit5', include: '*.jar')

    excludeTags = ['DebugRun']// optional param
    includeTests = ['^.*Check$', '^.*Probe$']// optional param
    details = SQJUnit5.Details.verbose // optional param
    reportsdir = file('build/testReportDir') // optional param
}

现在 junit5 测试可以用作通常的 Gradle 任务。

于 2017-04-21T06:56:25.000 回答