如何在Gradle中使用JUnit 5?

jgzswidk  于 2023-08-05  发布在  其他
关注(0)|答案(6)|浏览(123)

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

**预期结果:**Tthe JUnit 4 test gave a nice 'passed' in the output and a html report in build/reports/tests .
**实际结果:**下面的JUnit 5测试没有输出除了(...) build succesful之外的任何东西,而我知道测试实际上没有运行,因为没有通过/跳过/失败的测试日志输出,并且在测试中放入fail可以保持构建成功。

运行gradle test --info会产生Skipping task ':testClasses' as it has no actions.,其中有很多我认为是不相关的输出。令人惊讶的是,它还显示Executing task ':test'Generating HTML test report... Finished generating test html results以及类似的build/test-results/test中的xml,而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");
    }
}


我的文件夹结构是,使用包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现在希望源代码和测试在他们自己的包中。

我努力

显然这不是关于这个主题的第一个问题,我找到的所有相关问题都是

但正如你所看到的,这是针对旧版本的IntelliJ,根据其中一个答案,我已经在使用IJ 2016.3.3及更高版本的语法,在一个JUnit依赖行中,所以应该没问题。

链接回到上面的问题,并链接到这个Jetbrains blog,它使用与上面问题相同的行。也链接到:

testRuntime("org.junit.vintage:junit-vintage-engine:5.0.0-M1")


这在Why were JUnit Jupiter and JUnit Vintage separated When I Running TestCase in IntelliJ?中有解释。嗯,当我运行它时,输出显示它找不到这个版本,但根据Maven Repository,这个版本是针对JUnit 5的:

testRuntime("org.junit.vintage:junit-vintage-engine:4.12.0-M4")


那里的答案指出,您可以在IntelliJ中运行测试,因为后来的版本支持JUnit 5。我知道,当我在IntelliJ中运行时,测试运行得很好。但是我想使用Gradle(和Travis,它需要依赖管理)。

我试过用

testCompile("org.junit.platform:junit-platform-gradle-plugin:1.0.0-M3")
testCompile("org.junit.jupiter:junit-jupiter-engine:5.0.0-M3")


但结果没有改变
我的模板项目位于https://github.com/PHPirates/java-template-project上,但此问题应包含所有必要的信息。

ifsvaxew

ifsvaxew1#

新增:Gradle 4.6支持JUnit 5

正如在这个GitHub问题中所指出的,从Gradle 4.6开始支持JUnit 5!4.6的官方发布说明(在编辑最新版本时,请检查GitHub releases page以确保您使用的是最新版本),位于docs.gradle.org。旧的设置仍然可以工作,但是使用这个可以使构建文件更干净。
[Edit 2019年5月]正如@deFreitas在他的answer中指出的那样,JUnit文档已经改进,现在他们在https://github.com/junit-team/junit5-samples/tree/r5.4.0/junit5-jupiter-starter-gradle上提供了一个完整的示例,特别是build.gradle。幸运的是,它实际上与这个答案相同。

更新分级

首先,确保您使用的是最新的Gradle版本,请查看最新版本at their GitHub releases。例如,如果是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's answer

Android(参见此帖子:JUnit 5 for Android testing

在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"
            }
        }
    }
}

但是,它只在我执行Gradle test任务时有效,* 在我运行check任务时无效。像往常一样,我通过创建一个失败的测试来测试这一点,然后我尝试Gradle任务是通过还是失败。

dzhpxtsq

dzhpxtsq2#

您需要两个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文档表单了解更多信息。

f4t66c6m

f4t66c6m3#

只是添加到知识库,我刚刚得到了以下与Gradle 4.7一起工作:

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

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

test {
    useJUnitPlatform()
}

字符串

bt1cpqcv

bt1cpqcv4#

由于github issue内置了对JUnit 5的支持,计划在Gradle 4.6中使用
因此,从Gradle 4.6开始,您的预期结果必须与实际结果相同。

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

UPD:
Gradle 4.6-rc-1于2018年2月16日发布,该版本提供了对junit 5的内置支持。
要启用junit 5支持,您需要更新gradle wrapper:

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

字符串
并添加一行到build.gradle:

test {
    useJUnitPlatform()
}

u1ehiz5o

u1ehiz5o5#

查看junit official documentation如何在gradle中使用junit 5。
build.gradle

plugins {
    id 'java'
}

repositories {
    mavenCentral()
}

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

test {
    useJUnitPlatform()
    testLogging {
        events "passed", "skipped", "failed"
    }
}

字符串

aydmsdu9

aydmsdu96#

对于那些在尝试将JUnit 5与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中添加这个测试配置块来启用JUnit 5。

test {
    useJUnitPlatform()
}


只需添加必要的jupitor-api和jupitor-engine依赖项,它就可以正常工作。
我试图浏览4.10的发行说明,但找不到任何有关此更改的信息。如果有人知道更多关于它背后的“为什么”,那么请englighting我以及。

相关问题