如何在“运行”任务启动并运行时运行自定义任务(用量角器编写的功能测试)?

时间:2014-06-18 08:39:33

标签: scala playframework sbt

我正在开发一个在Play Framework上构建的网络应用。

我想要实现的目标是创建一个像这样工作的自定义sbt任务:

  1. 启动播放应用程序
  2. 运行我的自定义任务(用javascript编写的功能测试,取决于正在运行的应用程序)
  3. 在我的自定义任务完成后停止应用程序
  4. 现在我被困在第二步了。

    我有这个正在运行的sbt脚本:

    lazy val anotherTask = taskKey[Unit]("run this first")
    lazy val myCustomTask = taskKey[Unit]("try to run shell in sbt")
    
    anotherTask := {
      println("i am the first task")
    }
    
    myCustomTask := {
      println("try to run shell")
      import scala.sys.process._
      println("git status" !!)
      println("the shell command worked, yeah!")
    }
    
    myCustomTask <<= myCustomTask.dependsOn(anotherTask)
    

    但是,如果我尝试通过修改脚本来使myCustomTask依赖于run任务(启动播放应用):

    myCustomTask <<= myCustomTask.dependsOn(runTask _)
    

    我收到以下错误:

      

    错误:类型不匹配;发现:( sbt.Configuration,String,   Seq [String])=&gt; sbt.Def.Initialize [sbt.Task [Unit]]必需:   sbt.Scoped.AnyInitTask       (扩展为)sbt.Def.Initialize [sbt.Task [T]] forSome {type T}

    我该如何解决这个问题?

    最后,我最终得到了这样的specs2类:

      "my app" should {
    
        "pass the protractor tests" in {
          running(TestServer(9000)) {
    
            Await.result(WS.url("http://localhost:9000").get, 2 seconds).status === 200
            startProtractor(getProcessIO) === 0
          }
        }
    
      }
    
    
      private def startProtractor(processIO: ProcessIO): Int = {
        Process("protractor", Seq( """functional-test/config/buildspike.conf.js"""))
          .run(processIO)
          .exitValue()
      }
    
      private def getProcessIO: ProcessIO = {
        new ProcessIO(_ => (),
          stdout => fromInputStream(stdout).getLines().foreach(println),
          _ => ())
      }
    

2 个答案:

答案 0 :(得分:4)

运行是Input Task,如果要将其与普通任务结合使用,则必须先将其转换为任务。

您可以使用toTask方法从输入任务中获取任务,如in the documentation所述。

myCustomTask <<= myCustomTask.dependsOn((run in Compile).toTask(""))

答案 1 :(得分:0)

我会使用以下内容来依赖run任务:

myCustomTask <<= myCustomTask dependsOn run

在更改构建时,我还会使用sbt.Process API来执行git status

"git version".!

应该可以正常工作(r)。