sbt没有区分给予测试跑步者的标志

时间:2017-08-15 17:26:44

标签: sbt

目前:

  • Sbt有多个测试运行器:scalaTest,junit-interface等。
  • 每个测试跑步者都有自己的一组旗帜(scalaTest flagsjunit-interface flags)。
  • 您可以通过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传递给测试运行器的标志的实际基本行为是什么?是否有一些文档可以解释发生了什么?

1 个答案:

答案 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")

Documentation on test framework arguments