0

我在 Scala sbt 项目中使用µtest 。我想用定制的测试运行器运行各种测试类,它由这样的代码组成

val results = AnotherClassWithTests.myTests.run()
println(results.leaves.count(_.value.isSuccess))

我希望在运行 sbt test 时执行它,我发现的唯一方法是扩展 utest.Testsuite并将测试方法留空。

这样,sbt 将找到该类并运行它,但该解决方案似乎并不理想。我可以AnotherClassWithTests通过不扩展 utest.Testsuite 来阻止 sbt 的运行程序执行,但我仍然会从 µtests 默认测试运行程序以及我自己的输出中获得不必要的输出。

如何在没有该 hack 的情况下将我的跑步者挂钩sbt test并使用它运行我的所有测试,跳过 µtests 默认跑步者?

我也可以访问 sbt 检测到的 µ-tests 列表吗?

4

1 回答 1

0

您可以完全覆盖test任务的行为,只需执行您的主类。从https://github.com/scala-js/scala-js/blob/v0.6.5/sbt-plugin/src/main/scala/scala/scalajs/sbtplugin/ScalaJSPluginInternal.scala#L547-L549获得灵感

/** Run a class in a given environment using a given launcher */
def jsRun(env: JSEnv, cp: CompleteClasspath, mainCl: String,
    launcher: VirtualJSFile, jsConsole: JSConsole, log: Logger) = {

  log.info("Running " + mainCl)
  log.debug(s"with JSEnv of type ${env.getClass()}")
  log.debug(s"with classpath of type ${cp.getClass}")

  // Actually run code
  env.jsRunner(cp, launcher, log, jsConsole).run()
}

def launcherContent(mainCl: String) = {
  val parts = mainCl.split('.').map(s => s"""["${escapeJS(s)}"]""").mkString
  s"${CoreJSLibs.jsGlobalExpr}$parts().main();\n"
}

def memLauncher(mainCl: String) = {
  new MemVirtualJSFile("Generated launcher file")
    .withContent(launcherContent(mainCl))
}

test in Test := {
  val mainClass = "path.to.AnotherClassWithTests"
  jsRun((jsEnv in Test).value, (scalaJSExecClasspath in Test).value, mainClass,
      memLauncher(mainClass), (scalaJSConsole in Test).value, streams.value.log)
}

要获取已检测到的测试列表,您可以使用 sbt 任务(definedTests in Test).value,或者可能使用(definedTestNames in Test).value.

于 2016-01-09T11:10:04.267 回答