0

Scala sbt プロジェクトでµtestを使用しています。このようなコードで構成されるカスタムメイドのテストランナーでさまざまなテストクラスを実行したい

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

sbt test の実行時に実行したいのですが、私が見つけた唯一の方法は、utest.Testsuite を拡張して tests メソッドを空のままにすることです。

このように、sbt はクラスを見つけて実行しますが、解決策は理想的ではないようです。utest.Testsuite を拡張しないことでsbt のランナーが実行AnotherClassWithTestsされるのを防ぐことができますが、それでも自分の出力と一緒に µtests のデフォルト テスト ランナーから不要な出力が得られます。

そのハックなしでランナーをフック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 に答える