52

在成功运行 JUnit 4 测试后,我正在尝试将 JUnit 5 与 Gradle 一起使用。

预期结果: JUnit 4 测试在输出中给出了很好的“通过”,并在build/reports/tests.

实际结果:下面的 JUnit 5 测试除了 之外没有输出任何东西(...) build succesful,而我知道测试实际上并没有运行,因为没有测试日志输出通过/跳过/失败,并且fail在测试中放入 a 可以保持构建成功。

在很多我认为主要是不相关的输出中运行gradle test --info收益率。Skipping task ':testClasses' as it has no actions.令人惊讶的是,它还对 xml 中的 xml 表示Executing task ':test'Generating HTML test report... Finished generating test html results类似build/test-results/test,虽然没有生成 xml,但 html 显示没有运行测试也没有错误,并且测试确实没有运行。

我也认为非常有趣的是,gradle test --debug产量

[TestEventLogger] Gradle Test Run :test STARTED
[org.gradle.api.internal.tasks.testing.junit.JUnitDetector] test-class-
scan : failed to scan parent class java/lang/Object, could not find the class file
[TestEventLogger]
[TestEventLogger] Gradle Test Run :test PASSED

而我唯一的测试包含

fail("test fails");

我认为这很奇怪!

我的构建文件是

apply plugin: 'java'

test {
    dependsOn 'cleanTest' // run tests every time

}

sourceSets {
    main {
        java {
            srcDirs 'src'
        }
    }
    test {
        java {
            srcDirs 'test'
        }
    }
}

repositories {
    mavenCentral()
}

dependencies {
    // when using this, it worked with a junit 4 test
//    testCompile 'junit:junit:4.10'
    // this should be needed for junit 5 (using M4 is required since IJ 2017.1.2
    testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0-M4")
}

test {
    testLogging {
        events "passed", "skipped", "failed"
    }
}

我的测试是

package mypackage;

import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;

public class HelloWorldTest {
    @Test
    public void testHelloWorld(){
        assertEquals(2, 1+1, "message");
    }
}

我的文件夹结构是,使用 package mypackage

java-template-project
--- src
    --- mypackage
        --- HelloWorld.java
--- test
    --- mypackage
        --- HelloWorldTest.java

在我使用的 IntelliJ 2017.1.3 中,模块结构如下所示

java-template-project
--- java-template-project_main
    --- src/mypackage
        --- HelloWorld(.java)
--- java-template-project_test
    --- test/mypackage
        --- HelloWorldTest(.java)

因为 Gradle 现在想要源代码和测试在他们自己的包中。

我试过的

显然这不是关于这个话题的第一个问题,我发现的所有相关问题都是

4

6 回答 6

53

新:Gradle 4.6 中的 JUnit 5 支持

正如从 Gradle 4.6 开始的这个 GitHub 问题中所指出的,支持 JUnit 5!docs.gradle.org上 4.6 的官方发布说明(在编辑最新版本时,但请查看GitHub 发布页面以确保您使用最新版本)。旧的设置仍然可以工作,但使用它会使构建文件更干净。

[2019 年 5 月编辑] 正如@deFreitas 在他的回答中指出的那样,JUnit 文档已经改进,现在他们在https://github.com/junit-team/junit5-samples/tree/r5.4.0/junit5提供了一个完整的示例-jupiter-starter-gradle,尤其是build.gradle那里。幸运的是,它实际上与此答案中的相同。

更新 Gradle

首先,确保您使用的是最新的 Gradle 版本,在他们的 GitHub 版本中查看最新版本。如果是例如 4.6,请在项目位置的终端中运行,gradlew wrapper --gradle-version=4.6或确保更新gradle/wrapper/gradle-wrapper.properties文件中的这一行:distributionUrl=https\://services.gradle.org/distributions/gradle-4.6-all.zip.

如何使用内置的 JUnit 5

然后使用问题中的java文件,目录结构等build.gradle文件将是(使用新plugins块)

plugins {
    id 'java'
}

repositories {
    mavenCentral()
    mavenLocal()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.0.3'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.0.3'
}

// These lines can be removed when you use the default directories src/main/kotlin and src/test/kotlin
sourceSets {
    main.java.srcDirs += 'src'
    main.resources.srcDirs += 'src'
    test.java.srcDirs += 'test'
    test.resources.srcDirs += 'test'
}

// Java target version
sourceCompatibility = 1.8

test {
    // Enable JUnit 5 (Gradle 4.6+).
    useJUnitPlatform()

    // Always run tests, even when nothing changed.
    dependsOn 'cleanTest'

    // Show test results.
    testLogging {
        events "passed", "skipped", "failed"
    }
}

PS 对于绝对最小版本,请参阅Ray 的回答

安卓

在 Android 上,我通过将以下内容添加到我的应用程序模块构建文件中,设法从问题中运行 JUnit 5 测试。如您所见,依赖项是相同的,但我不需要useJUnitPlatform(),并且测试配置块略有不同。

apply plugin: 'com.android.application'
// In fact I am not sure you need this, but I had it included to run Spek tests anyway
apply plugin: 'de.mannodermaus.android-junit5' 

repositories {
    mavenCentral()
    jcenter()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.3.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.3.1'
}


android {
    // I'm omitting your other configurations like compileSdkVersion, buildTypes etc.

    testOptions {
        unitTests.all {

            // Always run tests, even when nothing changed.
            dependsOn 'clean'

            // Show test results.
            testLogging {
                events "passed", "skipped", "failed"
            }
        }
    }
}

但是,它仅在我执行 Gradletest任务时才对我有用,而不是在我运行check任务时。像往常一样,我通过创建一个失败的测试来测试它,然后我尝试 Gradle 任务是通过还是失败。

于 2018-02-27T17:25:11.723 回答
25

您需要两个 JUnit 版本的引擎,并且需要应用 JUnit 平台 gradle 插件。我在你的 gradle 文件中没有看到。这是一个执行 JUnit 4 和 5 的工作 gradle 构建:

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath ("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M4")
    }
}

apply plugin: 'org.junit.platform.gradle.plugin'
...

dependencies {
...
    testCompile("junit:junit:4.12")
    testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0-M4")

    testCompile("org.junit.jupiter:junit-jupiter-api:5.0.0-M4")
    testRuntime("org.junit.jupiter:junit-jupiter-engine:5.0.0-M4")

    // Enable use of the JUnitPlatform Runner within the IDE
    testCompile("org.junit.platform:junit-platform-runner:1.0.0-M4")
}

junitPlatform {
    details 'tree'
}

有关这方面的更多信息,请参阅JUnit 文档表单。

于 2017-06-08T11:25:19.493 回答
14

只是添加到知识库中,我刚刚得到以下与 gradle 4.7 一起使用:

apply plugin: 'java'
repositories {
    jcenter()
}

dependencies {
    testImplementation 'org.junit.jupiter:junit-jupiter-api:5.1.1'
    testRuntimeOnly 'org.junit.jupiter:junit-jupiter-engine:5.1.1'
}

test {
    useJUnitPlatform()
}
于 2018-05-28T01:31:46.777 回答
7

由于 github问题内置对 JUnit 5 的支持,计划用于 Gradle 4.6

因此,从 gradle 4.6 开始,您的预期结果必须与实际结果相同。

预期结果:JUnit 4 测试在输出中给出了一个很好的“通过”,并在build/reports/tests.

升级版:

gradle 4.6-rc-1 于 2018 年 2 月 16 日发布,该版本提供了对 junit 5 的内置支持。

要启用 junit 5 支持,您需要更新 gradle 包装器:

gradle wrapper --gradle-version=4.6-rc-1

并在 build.gradle 中添加一行:

test {
    useJUnitPlatform()
}
于 2018-02-13T12:57:34.667 回答
2

查看junit 官方文档,了解如何将 junit 5 与 gradle 一起使用。

构建.gradle

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

dependencies {
    testImplementation('org.junit.jupiter:junit-jupiter:5.4.0')
}

test {
    useJUnitPlatform()
    testLogging {
        events "passed", "skipped", "failed"
    }
}
于 2019-03-11T20:35:26.740 回答
0

也许对那些在尝试将JUnit5与 gradle 版本4.10集成时遇到此问题的人有所帮助。

Could not find method test() for arguments [build_dzas89s5z18l3bfyn6b3q0dxv$_run_closure2$_closure9@8e60c6] on project ':app' of type org.gradle.api.Project.

实际上,在 4.10 中,您不需要在 build.gradle 中添加这个测试配置块来启用 JUnit5。

test {
    useJUnitPlatform()
}

只需添加必要的 jupitor-api 和 jupitor-engine 依赖项,它就可以正常工作。

我试图探索 4.10 的发行说明,但找不到有关此更改的任何信息。如果有人知道更多关于它背后的“为什么”,那么也请启发我。

于 2019-01-07T15:59:18.970 回答