我正在开发一个项目,其中运行某些测试的标准方法foo
是run foo --bar --baz --qux --quux someDirectory
。更糟糕的是,文档很薄,需要花些时间来弄清楚测试的运行方式。
这种情况的原因是项目执行一些代码生成(它生成c ++,然后编译并运行),测试是运行生成的代码而不是生成代码的模型这是由同一个项目产生的。从这个角度来看,你可以看到事情是如何形成的,但它使得运行测试变得不直观。
我希望能够使用test foo
运行测试。是否可以让test foo
只执行上面的运行命令,如果是,我该怎么做?
如果不可能,我会添加一些文档,以便项目的新手可以更轻松地解决问题。但是,我更愿意将其与使用sbt的其他项目保持一致。
答案 0 :(得分:4)
目前执行此操作的最佳方法是直接实现自定义任务。有关详细信息,请参阅Input Tasks。
// A custom task is required because `test` doesn't accept input.
lazy val customTest = inputKey[Unit]("custom test")
// This custom parser accepts a space separated list of arguments and then appends
// the fixed arguments to them. To do further parsing based on the user-specified
// arguments, use `flatMap` and return the next Parser.
lazy val testParser =
Def.spaceDelimited().map( (explicitArgs: Seq[String]) =>
explicitArgs ++ Seq("--bar", "--baz", "--qux", "--quux", "someDirectory")
)
customTest := {
// the result of parsing
val args = testParser.parsed
// auto-detected main class: can replace with literal string
val main = (mainClass in Compile).value getOrElse error("No main class detected.")
// main classpath, including compiled classes
val classpath = (fullClasspath in Compile).value.files
// provides Scala code execution
val scalaRun = (runner in (Compile, run)).value
val result = scalaRun.run(main, classpath, args, streams.value.log)
// handle any error
result foreach { errorMsg => sys.error(errorMsg) }
}