2016-01-09 3 views
0

Я использую µtest в проекте Scala sbt. Я хочу, чтобы запускать различные тестовые классы с выполненный на заказ тест бегун, который состоит из кода, как этотКрючок Sbt для пользовательского тест-теста μtest

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

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

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

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

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

ответ

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.

Смежные вопросы