Sbt hook для пользовательского µtest test runner

Я использую µtest в проекте Scala SBT. Я хочу запускать различные классы тестов с помощью специального тестового прогона, который состоит из такого кода

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

Я хочу, чтобы он выполнялся при запуске sbt test, и единственный способ, который я нашел, - это расширить utest.Testsuite и оставить метод tests пустым.

Таким образом, sbt найдет класс и запустит его, но решение не кажется идеальным. Я могу помешать исполнителю SBT выполнить AnotherClassWithTests из-за того, что он не расширяет utest.Testsuite, но все равно я получу ненужные выходные данные от запускающего тест по умолчанию µtests вместе со своим собственным выводом.

Как я могу подключить моего бегуна к sbt test без этого взломать и запустить все мои тесты с ним, пропуская µtests по умолчанию бегун?

Могу ли я получить доступ к списку µ-тестов, которые также определяются sbt?

1 ответ

Решение

Вы можете полностью изменить поведение test задача, которая выполняет ваш основной класс. Черпая вдохновение из https://github.com/scala-js/scala-js/blob/v0.6.5/sbt-plugin/src/main/scala/scala/scalajs/sbtplugin/ScalaJSPluginInternal.scala

/** 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,

Другие вопросы по тегам