如何在Play框架中用sbt仅测试单个指定测试目录
我之前也碰到过这种头疼的情况——sbt默认会把test目录下所有子目录都当作测试源码的一部分,哪怕你指定了test:testOnly,它还是会先尝试编译所有测试代码,包括那个有编译问题的dir1。给你几个实用的解决办法:
方法一:拆分测试配置(推荐长期方案)
如果之后经常需要单独测试某个子目录,最好在build.sbt里给不同的测试目录配置独立的测试任务。比如给dir2创建一个自定义测试配置:
lazy val Dir2Test = config("dir2test") extend Test lazy val root = (project in file(".")) .enablePlugins(PlayScala) .configs(Dir2Test) .settings( inConfig(Dir2Test)(Defaults.testSettings), sourceDirectory in Dir2Test := baseDirectory.value / "test" / "dir2", // dir2默认继承了Test配置的依赖(比如主项目代码),一般无需额外配置 )
配置完成后,直接运行以下命令就能只编译并测试test/dir2:
sbt dir2test:test
这个方案完全隔离了不同测试目录的编译和测试流程,以后想单独测哪个目录都很方便。
方法二:临时排除有问题的目录(适合一次性操作)
如果只是临时想跳过dir1,不想修改配置文件,可以通过临时设置源码过滤规则来实现:
交互模式操作:
- 进入sbt交互模式:
sbt - 执行过滤命令:
set testSources in Test := (testSources in Test).value.filterNot(_.getPath.contains("dir1"))
- 再运行测试:
test:testOnly dir2/*
单行命令直接执行:
sbt 'set testSources in Test := (testSources in Test).value.filterNot(_.getPath.contains("dir1"))' test:testOnly dir2/*
这样sbt就只会把dir2的源码当作测试源,完全不会去编译dir1的代码。
方法三:仅编译指定目录再测试
如果dir2的测试代码完全独立,没有依赖dir1的内容,也可以先单独编译dir2,再运行测试:
sbt "test:compileOnly dir2/**/*.scala" test:testOnly dir2/*
不过这个方法的可靠性稍差,如果dir2有隐性依赖dir1的代码,还是会触发编译错误,所以更适合临时应急用。
内容的提问来源于stack exchange,提问作者user2259183
相关产品推荐
相关产品推荐

