如何在Gradle中使用JUnit 5?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Gradle中使用JUnit 5?相关的知识,希望对你有一定的参考价值。
在成功运行JUnit 4测试后,我正在尝试将JUnit 5与Gradle一起使用。
预期结果:JUnit 4测试在输出中给出了一个很好的'通过',在build/reports/tests
中给出了一个html报告。
实际结果:如下所示的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现在想要源和测试在他们自己的包中。
我尝试了什么
显然这不是关于这个主题的第一个问题,我发现的所有相关问题都是
- Gradle project running jUnit 5 tests in IntelliJ 但是你可以看到这是针对旧版本的IntelliJ,并且我已经根据其中一个答案使用了IJ 2016.3.3及更高版本的语法,在一个JUnit依赖行中,所以应该没问题。
- Upgrade from JUnit 4 to JUnit 5 in intellij with gradle 回到上面的问题链接,并链接到这个使用与上述问题相同的Jetbrains blog。还链接到:
- Integrate JUnit 5 tests results with Intellij test report在这个问题中,这个也显示为依赖
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)。 - How to capture stdout/stderr in junit 5 gradle test report?
我试过用
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,但此问题应包含所有必要的信息。
您需要两个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 doc表格。
New: JUnit 5 support in Gradle 4.6
正如指出的那样,来自Gradle 4.6的in this GitHub issue支持JUnit 5!正式发布的4.6版本(在编辑最新版本时,但请查看GitHub releases page以确保使用最新版本)at docs.gradle.org。旧设置仍然有效,但使用此设置可使构建文件更加清晰。
[编辑2019年5月]正如@deFreitas在他的answer中指出的那样,JUnit文档已经改进,现在他们在https://github.com/junit-team/junit5-samples/tree/r5.4.0/junit5-jupiter-starter-gradle提供了一个完整的例子,特别是那里的build.gradle
。幸运的是,事实证明它与这个答案中的那个实际上是一样的。
更新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
在Android上,我设法通过将以下内容添加到我的app模块构建文件来运行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任务通过或失败。
只是添加到知识库,我只需要使用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()
由于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包装器:
gradle wrapper --gradle-version=4.6-rc-1
并且只为build.gradle添加一行:
test
useJUnitPlatform()
结帐junit official documentation如何使用junit 5与gradle。
的build.gradle
plugins
id 'java'
repositories
mavenCentral()
dependencies
testImplementation('org.junit.jupiter:junit-jupiter:5.4.0')
test
useJUnitPlatform()
testLogging
events "passed", "skipped", "failed"
尝试将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()
只需添加jupiter-api和jupiter-engine所需的依赖项就可以正常工作。
我试图探索4.10的发行说明,但找不到任何有关此更改的内容。如果有人知道更多关于它背后的“为什么”,那么请启发我。
以上是关于如何在Gradle中使用JUnit 5?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Gradle 和 JUnit 5 仅运行特定测试?
如何将 Gradle 中的原生 JUnit 5 支持与 Kotlin DSL 结合使用?
如何在 JUnit 5 中替换 WireMock @Rule 注释?
如何通过 Gradle 测试任务在我的 JUnit 上启用调试