我的代码中有两种类型的测试,以UnitTest和IntegrationTest结尾。当然,有一些遗留的JUnit 4测试和应该由JUnit 5编写的新测试。
我想要什么:
可以从IDE(IntelliJ IDEA)运行的UnitTestSuite和IntegrationTestSuit类,每个类都有按测试类名结尾的过滤器。另外,我希望两个不同的gradle任务分别运行自己的一组测试(理想情况下基于西装,或者至少基于类名)。
我尝试过的事情:
此测试套件在IDE上运行良好,据我了解,它应该同时运行JUnit 4和JUnit 5测试。但是,这种方法似乎更像是一种解决方法,而不是实际的套件支持。
@RunWith(JUnitPlatform.class)
@IncludeClassNamePatterns({ "^.*UnitTest$" })
public class UnitTestSuite {
}
我也创建了这个Gradle任务,但是它没有对我说任何测试:
WARNING: Ignoring test class using JUnitPlatform runner
test { Test t ->
useJUnitPlatform()
include "UnitTestSuite.class"
}
那么,有没有一种解决方案可以同时运行JUnit 4和JUnit 5测试,并从IDE和Gradle任务中按名称过滤(收集到西装)?
答案 0 :(得分:1)
在Gradle中,您可以配置多个test
任务,一个任务用于JUnit 4,另一个任务用于JUnit 5。
我在Spring Framework构建中完全做到了这一点。请参阅spring-test.gradle中的testJUnitJupiter
和test
任务。
task testJUnitJupiter(type: Test) {
description = "Runs JUnit Jupiter tests."
useJUnitPlatform {
includeEngines "junit-jupiter"
excludeTags "failing-test-case"
}
filter {
includeTestsMatching "org.springframework.test.context.junit.jupiter.*"
}
reports.junitXml.destination = file("$buildDir/test-results")
// Java Util Logging for the JUnit Platform.
// systemProperty("java.util.logging.manager", "org.apache.logging.log4j.jul.LogManager")
}
test {
description = "Runs JUnit 4 tests."
dependsOn testJUnitJupiter, testNG
useJUnit()
scanForTestClasses = false
include(["**/*Tests.class", "**/*Test.class"])
exclude(["**/testng/**/*.*", "**/jupiter/**/*.*"])
reports.junitXml.destination = file("$buildDir/test-results")
}
您当然可以命名它们并根据需要配置它们。
答案 1 :(得分:0)
有一些警告的替代选项是使用JUnit 5运行JUnit 4(甚至3)测试。为此,您将需要运行时类路径上的老式引擎,如下所示:
def junit5Version = "5.7.0"
dependencies {
// other deps
testImplementation "org.junit.jupiter:junit-jupiter:${junit5Version}"
testRuntimeOnly "org.junit.vintage:junit-vintage-engine:${junit5Version}"
}
这也可以在IntelliJ IDEA中使用。
有关如何使JUnit 4的其他一些JUnit 4功能起作用的源和进一步说明,请参见:https://junit.org/junit5/docs/current/user-guide/#migrating-from-junit4-running