Sar*_*ath 9 command-line scala task sbt scalatest
我想要一个SBT任务,它将逗号分隔的测试类列表作为命令行的输入,由完全限定名称给出.现在我使用硬编码值运行任务但我想从命令行获取它.有人可以帮我写这样的任务吗?
lazy val runTask = inputKey[Unit]("custom run")
runTask := {
val one = (runMain in Compile).fullInput(" org.scalatest.tools.Runner -P1 -C reporter.TestReporter -o -s testcase.GetAccountInfo -s testcase.GetProfileInfo").evaluated
}
Run Code Online (Sandbox Code Playgroud)
像这样的东西,
sbt runTask testcase.GetProfileInfo,testcase.GetAccountInfo
Run Code Online (Sandbox Code Playgroud)
提前致谢.
lpi*_*ora 11
你必须有一个Parser,它将解析给予任务的输入.获得输入后,您可以转换(runMain in Compile).toTask并将输入提供给任务.
build.sbtimport sbt.complete._
import complete.DefaultParsers._
lazy val myRunTask = inputKey[Unit]("Runs actual tests")
lazy val FullQualifiedClassName =
(charClass(c => isScalaIDChar(c) || (c == '.'), "class name")).+.string
def commaDelimited(display: String) =
token(Space) ~> repsep(token(FullQualifiedClassName, display), token(","))
lazy val testClassArgs: Parser[Seq[String]] =
commaDelimited("<full qualified test class name>").map {
xs: Seq[String] => xs.map(e => s" -s $e ")
}
myRunTask := Def.inputTaskDyn {
val classes = testClassArgs.parsed
runMainInCompile(classes)
}.evaluated
def runMainInCompile(classes: Seq[String]) = Def.taskDyn {
(runMain in Compile).toTask(s" org.scalatest.tools.Runner -P1 -C reporter.TestReporter -o ${classes.mkString}")
}
Run Code Online (Sandbox Code Playgroud)
让我们从解析器开始.解析器必须占用一个空格,然后是用逗号分隔的类.
让我们首先定义一个解析器,解析完整的限定类名:
lazy val FullQualifiedClassName =
(charClass(c => isScalaIDChar(c) || (c == '.'), "class name")).+.string
Run Code Online (Sandbox Code Playgroud)
一旦我们有了解析器,我们就可以将它与另一个解析器结合起来.我们需要创建一个解析器,它使用逗号分隔的完全限定类名:
def commaDelimited(display: String) =
token(Space) ~> repsep(token(FullQualifiedClassName, display), token(","))
Run Code Online (Sandbox Code Playgroud)
的~>操作者意味着在它的左侧,输入将被丢弃.解析器返回的值是Seq[String]完全限定的类名.
从您的问题来看,您希望您的课程以前缀为前缀-s.你可以稍后再做,但只是为了展示解析器的另一个功能,我将在这里做.
您可以使用解析器的输出并将其转换为另一个输出map.
lazy val testClassArgs: Parser[Seq[String]] =
commaDelimited("<full qualified test class name>").map {
xs: Seq[String] => xs.map(e => s" -s $e ")
}
Run Code Online (Sandbox Code Playgroud)
好的,我们快到了.
我们可以定义一个新的输入任务键.我会选择myRunTask,因为否则它会与runTask已经存在的碰撞.
让我们定义一个方法,它接受一系列类(已经加前缀-s)作为参数,并返回从a Task 获得的InputTask.
def runMainInCompile(classes: Seq[String]) = Def.taskDyn {
(runMain in Compile).toTask(s" org.scalatest.tools.Runner -P1 -C reporter.TestReporter -o ${classes.mkString}")
}
Run Code Online (Sandbox Code Playgroud)
现在让我们将所有元素组合在一个任务中:
myRunTask := Def.inputTaskDyn {
val classes = testClassArgs.parsed
runMainInCompile(classes)
}.evaluated
Run Code Online (Sandbox Code Playgroud)