在JUnit+Gradle环境中,如何实现测试类与标签的并集筛选?
实现JUnit + Gradle测试类与标签的并集执行
要实现指定测试类和指定标签测试的并集执行(满足任一条件即运行),核心是避开Gradle默认的"过滤叠加(交集)"逻辑,改用JUnit Platform原生的选择器机制,具体方案如下:
方案一:直接使用JUnit Platform选择器(推荐)
JUnit Platform的selectors配置支持同时添加类选择器和标签选择器,所有选择器之间默认是并集关系,只要测试匹配其中一个选择器就会被执行。
Groovy DSL(build.gradle)示例:
test { useJUnitPlatform { selectors { // 添加指定的单个测试类 selectClass('com.example.MyFirstTest') selectClass('com.example.MySecondTest') // 添加需要包含的标签 selectTag('fast') selectTag('integration') } } }
Kotlin DSL(build.gradle.kts)示例:
tasks.test { useJUnitPlatform { selectors { selectClass("com.example.MyFirstTest") selectClass("com.example.MySecondTest") selectTag("fast") selectTag("integration") } } }
方案二:匹配批量测试类 + 标签
如果需要匹配某包下的所有测试类(而非单个类),可以用selectPackage代替selectClass,同样和标签形成并集:
test { useJUnitPlatform { selectors { // 匹配指定包下的所有测试类 selectPackage('com.example.tests.unit') // 匹配标签为smoke的所有测试 selectTag('smoke') } } }
为什么原来的方式是交集?
你之前使用的TestFilter.includeTestsMatching()/Test.include()和jUnitPlatformOptions.includeTags()是先后叠加的过滤逻辑:Gradle先过滤出符合类规则的测试,JUnit再从这些测试里筛选符合标签的,最终结果自然是两者的交集。而使用selectors是直接告诉JUnit要选择的测试范围,多个选择器之间是"或"的关系,完美实现并集需求。
内容的提问来源于stack exchange,提问作者Bee
相关产品推荐
相关产品推荐

