目前:
您可以通过sbt将标志传递给测试运行器,例如:
$ sbt '<project>/test-only * -- -f <out_file>'
( - f是scalaTest标志)
但是,标志似乎传递给所有测试运行器,即使标志与所有测试运行器不兼容。
我也遇到了与我在文档中发现的行为相反的行为。 ScalaTest说-v
标志将&#34; 打印ScalaTest版本&#34;和junit-interface说它会&#34; Log&#34;测试运行开始&#34; /&#34;测试开始&#34; /&#34;测试运行结束&#34;日志级别的事件&#34;信息&#34;而不是&#34;调试&#34;。&#34;相反,ScalaTest会抛出一个无法识别的标志异常。
$ sbt '<project>/test-only * -- -v'
java.lang.IllegalArgumentException: Argument unrecognized by ScalaTest's Runner: -v
at org.scalatest.tools.ArgsParser$.parseArgs(ArgsParser.scala:425)
at org.scalatest.tools.Framework.runner(Framework.scala:929)
...
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
[error] (elasticSearchDriver/test:testOnly) java.lang.IllegalArgumentException: Argument unrecognized by ScalaTest's Runner: -v
[error] Total time: 1 s, completed Aug 15, 2017 11:12:56 AM
通过sbt传递给测试运行器的标志的实际基本行为是什么?是否有一些文档可以解释发生了什么?
答案 0 :(得分:2)
通过观察SBT(0.13.x),我们最终得到了以下部分:
def inputTests(key: InputKey[_]): Initialize[InputTask[Unit]] = inputTests0.mapReferenced(Def.mapScope(_ in key.key))
private[this] lazy val inputTests0: Initialize[InputTask[Unit]] =
{
val parser = loadForParser(definedTestNames)((s, i) => testOnlyParser(s, i getOrElse Nil))
Def.inputTaskDyn {
val (selected, frameworkOptions) = parser.parsed
val s = streams.value
val filter = testFilter.value
val config = testExecution.value
implicit val display = Project.showContextKey(state.value)
val modifiedOpts = Tests.Filters(filter(selected)) +: Tests.Argument(frameworkOptions: _*) +: config.options
val newConfig = config.copy(options = modifiedOpts)
val output = allTestGroupsTask(s, loadedTestFrameworks.value, testLoader.value, testGrouping.value, newConfig, fullClasspath.value, javaHome.value, testForkedParallel.value, javaOptions.value)
val taskName = display(resolvedScoped.value)
val trl = testResultLogger.value
val processed = output.map(out => trl.run(s.log, out, taskName))
Def.value(processed)
}
}
请注意以下一行:Tests.Filters(filter(selected)) +: Tests.Argument(frameworkOptions: _*) +: config.options
通过阅读本文,我推断出sbt将传递给它的参数传递给所有底层测试框架。
不要在命令中传递测试框架标志。在*.sbt
文件中配置它们,例如:
testOptions in Test += Tests.Argument(TestFrameworks.ScalaCheck, "-f")