如何运行默认被排除的munit测试?命令行参数不生效问题
问题描述
我编写了如下MUnit测试:
package myawesomeproject import munit.FunSuite class MySillyTest extends FunSuite { val theTag = new munit.Tag("tagname") test("THETEST".tag(theTag)) { assertEquals(2, 3) } }
并在build.sbt中配置默认排除该测试:
lazy val myawesomeproject = project .in(file("myawesomeproject")) .settings( // ... Test / testOptions += Tests.Argument(MUnitFramework, "--exclude-tags=tagname") )
运行test命令时,测试按预期被排除。但执行myawesomeproject / testOnly -- --tests=THETEST --include-tags=tagname命令尝试手动覆盖排除规则时,该测试仍未执行,命令行设置似乎无法覆盖build.sbt中的配置。
解决办法
1. 命令行清空排除规则后再添加包含规则
MUnit的过滤逻辑是先执行排除规则,再执行包含规则。要先在命令行清空默认的排除列表,再指定要包含的标签:
myawesomeproject / testOnly -- --exclude-tags= --include-tags=tagname --tests=THETEST
这里--exclude-tags=表示清除所有预先设置的排除标签,后续的--include-tags就能正常生效。
2. 临时重置testOptions参数
通过sbt的set命令临时覆盖build.sbt中的testOptions配置,直接指定要包含的标签:
sbt "set Test / testOptions := Seq(Tests.Argument(MUnitFramework, '--include-tags=tagname'))" "myawesomeproject / testOnly -- --tests=THETEST"
3. 用系统属性控制排除规则
修改build.sbt,通过系统属性决定是否启用排除规则,无需修改配置就能灵活切换:
Test / testOptions ++= { if (sys.props.get("runExcluded").contains("true")) Nil else Seq(Tests.Argument(MUnitFramework, "--exclude-tags=tagname")) }
运行时添加系统属性即可执行被排除的测试:
sbt -DrunExcluded=true "myawesomeproject / testOnly -- --tests=THETEST"
4. 创建独立的测试配置
在build.sbt中新增一个专门用于运行被排除测试的配置,避免和默认测试配置冲突:
lazy val ExcludedTests = config("excluded") extend Test lazy val myawesomeproject = project .in(file("myawesomeproject")) .configs(ExcludedTests) .settings( inConfig(ExcludedTests)(Defaults.testSettings), // 该配置下默认包含tagname标签的测试 ExcludedTests / testOptions := Seq(Tests.Argument(MUnitFramework, "--include-tags=tagname")), // 默认测试配置排除tagname标签 Test / testOptions += Tests.Argument(MUnitFramework, "--exclude-tags=tagname") )
之后直接运行该配置下的测试命令:
sbt myawesomeproject/excluded:testOnly -- --tests=THETEST
内容的提问来源于stack exchange,提问作者Andrey Tyukin
相关产品推荐
相关产品推荐

