sbt fullRunTask未执行求助:Play框架集成测试数据库准备
解决sbt fullRunTask在Play集成测试中未执行的问题
嘿,我知道你在Play框架里折腾集成测试的数据库准备时遇到了fullRunTask不执行的坑,这就给你捋清楚问题出在哪,以及怎么解决!
问题根源
你现在的写法有两个核心问题:
fullRunTask是用来定义任务的,不是直接在Tests.Setup里调用执行的:Tests.Setup里的代码是在sbt的设置阶段运行的,而fullRunTask是用来声明一个新任务的,不是触发任务执行的命令。- 你的代码片段里还有拼写错误:
testOptions in Integratio...应该补全为testOptions in IntegrationTest。
正确的解决方案
我们需要先正确定义fnHelper任务,然后把它和集成测试的任务关联起来,确保测试启动前自动执行这个准备任务。
步骤1:正确定义fnHelper任务
首先在build.sbt里单独定义这个任务,指定它属于IntegrationTest配置,并且指向你的FTTestHelper主类:
// 定义fnHelper任务,运行helper.FTTestHelper主类 lazy val fnHelper = fullRunTask[Unit]( "fnHelper", IntegrationTest, "helper.FTTestHelper" )
步骤2:关联集成测试任务和fnHelper
接下来,让集成测试的任务依赖fnHelper,这样每次运行集成测试时,sbt会先执行fnHelper,再跑测试:
// 让IntegrationTest的test任务依赖fnHelper test in IntegrationTest := (test in IntegrationTest).dependsOn(fnHelper).value // 可选:如果需要在控制台打印提示信息,可以把日志放在FTTestHelper里,或者用任务的doLast fnHelper := fnHelper.doLast { println("########################### Prepare Functional Tests #####################") }.doFinally { println("#################################### Finished ") }.value
步骤3:确保FTTestHelper有main方法
别忘了你的helper.FTTestHelper类必须包含一个可执行的main方法,比如:
package helper object FTTestHelper { def main(args: Array[String]): Unit = { // 这里写你的数据库准备逻辑:比如初始化表、插入测试数据等 println("正在执行数据库准备工作...") } }
完整的build.sbt片段示例
把这些整合起来,你的build.sbt里相关部分应该是这样的:
import play.sbt.PlayImport._ import sbt._ // 定义fnHelper任务 lazy val fnHelper = fullRunTask[Unit]( "fnHelper", IntegrationTest, "helper.FTTestHelper" ) lazy val root = (project in file(".")) .enablePlugins(PlayScala) .settings( name := "your-project-name", scalaVersion := "2.11.11", sbtVersion := "1.0.3", // 集成测试配置 Defaults.itSettings, // 让集成测试依赖fnHelper test in IntegrationTest := (test in IntegrationTest).dependsOn(fnHelper).value, // 添加日志提示 fnHelper := fnHelper.doLast { println("########################### Prepare Functional Tests #####################") }.doFinally { println("#################################### Finished ") }.value )
验证方法
运行集成测试时,直接执行:
sbt it:test
你应该会先看到日志打印,然后FTTestHelper的main方法被执行,最后才开始运行集成测试。
内容的提问来源于stack exchange,提问作者shaohui
相关产品推荐
相关产品推荐

